Submission #265520

#TimeUsernameProblemLanguageResultExecution timeMemory
265520SegtreeBigger segments (IZhO19_segments)C++14
37 / 100
650 ms71356 KiB
#include<iostream> #include<algorithm> #include<vector> #include<fstream> using namespace std; typedef long long ll; typedef pair<ll,ll> P; #define rep(i,n) for(int i=0;i<n;i++) #define all(x) x.begin(),x.end() #define chmin(a,b) a=min(a,b) #define chmax(a,b) a=max(a,b) #define N 3010 ll n,a[N],s[N]; ll dp[N][N]; int main(){ cin.tie(0); ios::sync_with_stdio(0); cin>>n; rep(i,n)cin>>a[i]; s[0]=0; rep(i,n)s[i+1]=s[i]+a[i]; rep(i,n+1)dp[i][0]=1e18; dp[0][0]=0; for(int k=1;k<=n;k++){ vector<ll> score,place; //scoreは単調増加 for(int i=0;i<=n;i++){ ll l=-1,r=score.size(),mid; while(l<r-1){ mid=(l+r)>>1; if(s[i]>=score[mid])l=mid; else r=mid; } if(l>=0){ dp[i][k]=s[i]-s[place[l]]; } else dp[i][k]=1e18; ll sc=dp[i][k-1]+s[i]; while(score.size()>0){ if(score.back()>=sc){ score.pop_back(); place.pop_back(); } else break; } score.push_back(sc); place.push_back(i); } } ll ans=1; for(int k=1;k<=n;k++){ if(dp[n][k]<1e18)ans=k; } cout<<ans<<endl; }
#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...