제출 #1308663

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