Submission #334868

#TimeUsernameProblemLanguageResultExecution timeMemory
334868GurbanBigger segments (IZhO19_segments)C++17
100 / 100
184 ms34668 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int maxn=5e5+5; int n,a[maxn]; ll p[maxn],T[4*maxn]; pair<int,ll>dp[maxn]; void upd(int pos,ll val,int l,int r,int nd){ if(l == r){T[nd]=val;return;} if(pos <= (l+r)/2) upd(pos,val,l,(l+r)/2,nd*2); else upd(pos,val,(l+r)/2+1,r,nd*2+1); T[nd] = min(T[nd*2],T[nd*2+1]); } int tap(ll val,int l,int r,int nd){ if(l==r) return l; if(T[nd*2+1] <= val) return tap(val,(l+r)/2+1,r,nd*2+1); return tap(val,l,(l+r)/2,nd*2); } int main(){ ios::sync_with_stdio(false); cin.tie(0); cin >> n; for(int i = 1;i <= 4*n;i++) T[i] = 1e18; for(int i = 1;i <= n;i++) cin >> a[i],p[i]=p[i-1]+a[i]; dp[1] = {1,a[1]}; upd(1,2*a[1],1,n,1); for(int i = 2;i <= n;i++){ if(T[1] <= p[i]){ int pos = tap(p[i],1,n,1); dp[i] = {dp[pos].first+1,p[i]-p[pos]}; } else dp[i] = {dp[i-1].first,dp[i-1].second+a[i]}; upd(i,dp[i].second+p[i],1,n,1); } // for(int i = 1;i <= n;i++) cout<<dp[i].first<<' '; cout<<dp[n].first; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...