제출 #1164420

#제출 시각아이디문제언어결과실행 시간메모리
1164420ivaziva금 캐기 (IZhO14_divide)C++20
100 / 100
82 ms17320 KiB
#include <bits/stdc++.h> using namespace std; #define MAXN 100001 #define MAXM 17 #define int long long int n; int x[MAXN],g[MAXN],d[MAXN]; int energy[MAXN],gold[MAXN]; int sparse[MAXM][MAXN],lg[MAXN]; void build() { for (int i=2;i<MAXN;i++) lg[i]=lg[i/2]+1; for (int i=1;i<=n;i++) sparse[0][i]=x[i]-energy[i]; for (int j=1;j<MAXM;j++) { for (int i=1;i+(1<<j)<=n+1;i++) sparse[j][i]=min(sparse[j-1][i],sparse[j-1][i+(1<<(j-1))]); } } int query(int l,int r) {int k=lg[r-l+1];return min(sparse[k][l],sparse[k][r-(1<<k)+1]);} int32_t main() { cin>>n;energy[0]=0;gold[0]=0; for (int i=1;i<=n;i++) {cin>>x[i]>>g[i]>>d[i];gold[i]=gold[i-1]+g[i];energy[i]=energy[i-1]+d[i];} build();int ans=0; for (int levo=1;levo<=n;levo++) { int l=levo,r=n,rez=-1; while (l<=r) { int mid=(l+r)/2; if (query(mid,n)<=x[levo]-energy[levo-1]) {rez=mid;l=mid+1;} else r=mid-1; } if (rez==-1) continue; ans=max(ans,gold[rez]-gold[levo-1]); } cout<<ans<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...