제출 #1308661

#제출 시각아이디문제언어결과실행 시간메모리
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...