Submission #706893

#TimeUsernameProblemLanguageResultExecution timeMemory
706893ld_minh4354Bigger segments (IZhO19_segments)C++17
37 / 100
239 ms262144 KiB
#include<bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define pb push_back
#define debug(x) cout<<#x<<": "<<x<<"\n"

struct node
{
	long long s,e,m;
	int val;
	node *l,*r;
	
	node(long long S,long long E)
	{
		s=S;e=E;m=(s+e)/2;
		val=0;
		l=nullptr;r=nullptr;
	}
	
	void create()
	{
		if (s!=e)
		{
			l=new node(s,m);
			r=new node(m+1,e);
		}
	}
	
	void update(long long X,int V)
	{
		if (l==nullptr) create();
		
		if (s==e and s==X) val=max(val,V);
		else
		{
			if (X<=m) l->update(X,V);
			else r->update(X,V);
			val=max(l->val,r->val);
		}
	}
	
	int query(long long S,long long E)
	{	
		if (s==S and e==E) return val;
		
		if (l==nullptr) create();
		
		if (E<=m) return l->query(S,E);
		if (S>=m+1) return r->query(S,E);
		return max(l->query(S,m), r->query(m+1,E));
	}
}*root;

signed main()
{
	ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//	freopen("input.000","r",stdin);
//	freopen("output.000","w",stdout);
//	srand((unsigned)time(NULL));
//	rand()
	
	int n,i,a[100005],opt;
	long long pre[100005];
	pair<int,long long> dp[100005];
	
	cin>>n;
	root=new node(0,1e15);
	
	for (i=1;i<n+1;i++) cin>>a[i];
	pre[1]=a[1];
	for (i=2;i<n+1;i++) pre[i]=pre[i-1]+a[i];
	
	dp[1]={1,-a[1]};
	root->update(a[1]+pre[1], 1);
	for (i=2;i<n+1;i++)
	{
		dp[i]={1,-pre[i]};
		
		opt=root->query(0,pre[i]);
//		cout<<i<<" "<<opt<<"\n";
		if (opt!=0) dp[i]=max(dp[i], {dp[opt].fi+1, -pre[i]+pre[opt]});
		
		root->update(-dp[i].se+pre[i], i);
	}
	
//	for (i=1;i<n+1;i++) cout<<dp[i].fi<<" "<<dp[i].se<<"\n";
	cout<<dp[n].fi;
}

#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...