제출 #1283505

#제출 시각아이디문제언어결과실행 시간메모리
1283505I_FloPPed21Election (BOI18_election)C++20
100 / 100
360 ms21624 KiB
#include <iostream> using namespace std; const int N=5e5+5; const int inf=1e9; int n,v[N]; struct node { int suma; int prefix,sufix; int ans; }aint[4*N]; node combine(node x,node y) { node c={-inf,-inf,-inf,-inf}; c.suma=x.suma+y.suma; c.prefix=max(x.prefix,x.suma+y.prefix); c.sufix=max(y.sufix,y.suma+x.sufix); c.ans=max(x.prefix+y.sufix,max(x.ans+y.suma,y.ans+x.suma)); return c; } void build(int nod,int st,int dr) { if(st==dr) { aint[nod].prefix=max(v[st],0); aint[nod].sufix=max(v[st],0); aint[nod].suma=v[st]; aint[nod].ans=max(v[st],0); } else { int mij=(st+dr)/2; build(nod*2,st,mij); build(nod*2+1,mij+1,dr); aint[nod]=combine(aint[nod*2],aint[nod*2+1]); } } node query(int nod,int st,int dr,int l,int r) { if(l<=st&&dr<=r) { return aint[nod]; } else if(l>dr||st>r) { return {-0,-inf,-inf,-inf}; } else { int mij=(st+dr)/2; node c=combine(query(nod*2,st,mij,l,r),query(nod*2+1,mij+1,dr,l,r)); return c; } } void read() { cin>>n; for(int i=1;i<=n;i++) { char d; cin>>d; if(d=='C') v[i]=-1; else v[i]=1 ; } } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); read(); build(1,1,n); //cout<<aint[1].ans<<'\n'; int q; cin>>q; for(int i=1;i<=q;i++) { int l,r; cin>>l>>r; cout<<max(query(1,1,n,l,r).ans,0)<<'\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...