Submission #1308661

#TimeUsernameProblemLanguageResultExecution timeMemory
1308661goduadzesabaBigger segments (IZhO19_segments)C++20
27 / 100
1597 ms12864 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int N=3e3+5,inf=1e18; int _t,n,dp[N][N],p[N],f[N],k; map <int,int> mp; void upd(int x,int y){ for (int i=x; i<=k; i+=i&(-i)) f[i]=max(f[i],y); } int get(int x){ int ret=-inf; for (int i=x; i>0; i-=i&(-i)) ret=max(ret,f[i]); return ret; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n; for (int i=1; i<=n; i++) cin>>p[i],p[i]+=p[i-1]; for (int i=0; i<=n; i++) dp[i][1]=p[i]; for (int j=2; j<=n; j++){ mp.clear(); k=0; for (int i=1; i<=n; i++){ if (dp[i][j-1]<inf) mp[dp[i][j-1]+p[i]]=0; mp[p[i]]=0; } for (auto &i:mp) i.second=++k; for (int i=1; i<=k; i++) f[i]=-inf; for (int i=1; i<=n; i++){ dp[i][j]=min(inf,p[i]-get(mp[p[i]])); if (dp[i][j-1]<inf) upd(mp[dp[i][j-1]+p[i]],p[i]); // cout<<i<<" "<<j<<" - "<<dp[i][j]<<"\n"; } } for (int j=n; j>0; j--) if (dp[n][j]<inf){ cout<<j<<"\n"; break; } }
#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...