結果
問題 | No.448 ゆきこーだーの雨と雪 (3) |
ユーザー |
![]() |
提出日時 | 2016-11-19 00:14:46 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 165 ms / 2,000 ms |
コード長 | 1,561 bytes |
コンパイル時間 | 1,163 ms |
コンパイル使用メモリ | 162,604 KB |
実行使用メモリ | 11,332 KB |
最終ジャッジ日時 | 2024-06-11 19:32:45 |
合計ジャッジ時間 | 4,852 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 35 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:72:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 72 | scanf("%lld %lld",&N,&K); | ~~~~~^~~~~~~~~~~~~~~~~~~ main.cpp:74:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 74 | scanf("%lld %lld",&a[i],&b[i]); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<ll,ll> P;#define MAX_N 200005vector<ll> X;ll N,K;ll a[MAX_N],b[MAX_N];ll c[MAX_N];ll d[MAX_N];ll INF = (1LL<<60);ll tree[500];ll getMax(int l,int r){ll res=-INF;int i=l;while(i<r){if(i%500==0&& i+500<r){res=max(res,tree[i/500]);i+=500;}else{res=max(res,b[i]);i++;}}return res;}void update(int i,ll x){tree[i/500]=max(tree[i/500],x);}ll getSum(int l,int r){if(r<=l)return 0;return c[r]-c[l];}ll solve(ll x){fill(d,d+MAX_N, INF );d[0]=0;for(int i=0;i<N;i++){if(d[i]== INF)continue;ll sum=d[i];if( b[i]<=x ){d[i+1]=min(d[i+1], sum+b[i] );}int target=lower_bound( X.begin(),X.end(),a[i]+K)-X.begin();if( getMax(i+1,target) <= x )d[target]=min(d[target], sum+getSum(i+1,target) );}return d[N];}bool check(ll x){ll last=0;for(int i=0;i<N;i++){if(b[i]>x){if(last>a[i])return false;last=a[i]+K;}}return true;}int main(){fill(tree,tree+500, -INF );scanf("%lld %lld",&N,&K);for(int i=0;i<N;i++){scanf("%lld %lld",&a[i],&b[i]);update( i , b[i] );X.push_back(a[i]);if(i>0)assert(a[i]>a[i-1]);}X.push_back( INF );for(int i=0;i<N;i++)c[i+1]=c[i]+b[i];ll left=0,right=1e9,mid;while(left<right){mid=(left+right)/2;if(check(mid))right=mid;else left=mid+1;}printf("%lld\n",left);printf("%lld\n",solve(left));return 0;}