Submission #1313199

#TimeUsernameProblemLanguageResultExecution timeMemory
1313199boclobanchatBigger segments (IZhO19_segments)C++20
100 / 100
276 ms190724 KiB
#include<bits/stdc++.h>
using namespace std;
struct node { int child[2],val; };
const int MAXN=5e5+5;
long long pref[MAXN];
pair<int,long long> dp[MAXN];
node trie[MAXN*67];
int cntnode=1;
void ins(long long val,int idx)
{
	int pos=1;
	for(int i=60;i+1;i--)
	{
		int a=(val>>i)%2;
		if(!trie[pos].child[a]) trie[pos].child[a]=++cntnode;
		pos=trie[pos].child[a],trie[pos].val=idx;
	}
}
int get(long long val)
{
	int ans=0,pos=1;
	for(int i=60;i+1;i--)
	{
		int a=(val>>i)%2;
		if(a&&trie[pos].child[0]) ans=max(ans,trie[trie[pos].child[0]].val);
		if(!trie[pos].child[a]) return ans;
		pos=trie[pos].child[a];
	}
	ans=max(ans,trie[pos].val);
	return ans;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>pref[i];
		pref[i]+=pref[i-1];
	}
	for(int i=1;i<=n;i++)
	{
		ins(pref[i-1]+dp[i-1].second,i-1);
		int pos=get(pref[i]);
		dp[i]={dp[pos].first+1,pref[i]-pref[pos]};
	}
	cout<<dp[n].first;
}
#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...