Submission #287976

#TimeUsernameProblemLanguageResultExecution timeMemory
287976dvdg6566Bigger segments (IZhO19_segments)C++14
100 / 100
772 ms58884 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pi; typedef vector<ll> vi; typedef vector<pi> vpi; typedef long double ld; #define pb emplace_back #define mp make_pair #define f first #define s second #define SZ(x) (ll)x.size() #define ALL(x) x.begin(),x.end() #define lb lower_bound #define ub upper_bound const ll MAXN=500001; const ll MOD=1e9+7; const ll INF = 3e9; ll A[MAXN]; ll N; struct node{ node *l,*r; pi v; node(){ v=mp(0,0); l=r=nullptr; } pi ask(ll s,ll e,ll x,ll y){ ll m=(s+e)/2; assert(s<=x&&y<=e); if(s==x&&e==y)return v; pi t=mp(0,0); if(l&&x<=m)t=max(t, l->ask(s,m,x,min(y,m))); if(r&&y>m)t=max(t,r->ask(m+1,e,max(m+1,x),y)); return t; } void up(ll s,ll e,ll x,pi va){ ll m=(s+e)/2; assert(s<=x&&x<=e); if(s==e){v=max(v,va);return;} if(x<=m){ if(!l)l=new node(); l->up(s,m,x,va); }else{ if(!r)r=new node(); r->up(m+1,e,x,va); } v=mp(0,0); if(l)v=max(v,l->v); if(r)v=max(v,r->v); } }*root; int main(){ cin>>N; for(int i=1;i<=N;++i){ cin>>A[i]; A[i]+=A[i-1]; } vi des; for(int i=0;i<=N;++i){ des.pb(A[i]); } des.pb(1e18); sort(ALL(des)); des.resize(unique(ALL(des)) - des.begin()); root=new node(); for(int i=1;i<=N;++i){ ll tar=lb(ALL(des),A[i])-des.begin(); pi x=root->ask(0,SZ(des)-1,0,tar); ll p=x.s; if(i==N){ cout<<x.f+1; return 0; } ll xval=2*A[i]-A[p]; ll pos=lb(ALL(des),xval)-des.begin(); root->up(0,SZ(des)-1,pos, mp(x.f+1,i)); } }
#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...