#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*36];
int cntnode=1;
void ins(int val,int idx)
{
int pos=1;
for(int i=30;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(int val)
{
int ans=0,pos=1;
for(int i=30;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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |