제출 #1268449

#제출 시각아이디문제언어결과실행 시간메모리
1268449denislavElection (BOI18_election)C++20
100 / 100
531 ms20168 KiB
# include <iostream> using namespace std; const int MAX=5e5+11; int n,q; char a[MAX]; struct node { int sum,pref,suf,ans; node friend operator + (node A, node B) { if(A.ans==-1) return B; if(B.ans==-1) return A; node res; res.sum=A.sum+B.sum; res.pref=max(A.pref,A.sum+B.pref); res.suf=max(B.suf,A.suf+B.sum); res.ans=max(max(A.ans+B.sum,A.sum+B.ans),A.pref+B.suf); return res; } }; node tree[MAX*4]; void build(int v=1, int l=1, int r=n) { if(l==r) { if(a[l]=='C') tree[v]={-1,0,0,0}; else tree[v]={1,1,1,1}; return ; } int mid=(l+r)/2; build(v*2,l,mid); build(v*2+1,mid+1,r); tree[v]=tree[v*2]+tree[v*2+1]; } node query(int le, int ri, int v=1, int l=1, int r=n) { if(ri<l or r<le) return {-1,-1,-1,-1}; if(le<=l and r<=ri) return tree[v]; int mid=(l+r)/2; return query(le,ri,v*2,l,mid)+query(le,ri,v*2+1,mid+1,r); } int main() { ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; build(); cin>>q; while(q--) { int l,r; cin>>l>>r; cout<<query(l,r).ans<<"\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...