Submission #1308663

#TimeUsernameProblemLanguageResultExecution timeMemory
1308663goduadzesabaBigger segments (IZhO19_segments)C++20
27 / 100
173 ms70968 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; 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++){ k=0; vector <int> v; for (int i=1; i<=n; i++){ if (dp[i][j-1]<inf){ auto it=lower_bound(v.begin(),v.end(),dp[i][j-1]+p[i]); if (it==v.end() || *it!=dp[i][j-1]+p[i]) v.push_back(dp[i][j-1]+p[i]); } auto it=lower_bound(v.begin(),v.end(),p[i]); if (it==v.end() || *it!=p[i]) v.push_back(p[i]); } sort(v.begin(),v.end()); k=(int)v.size(); 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(lower_bound(v.begin(),v.end(),p[i])-v.begin()+1)); if (dp[i][j-1]<inf) upd(lower_bound(v.begin(),v.end(),dp[i][j-1]+p[i])-v.begin()+1,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...