제출 #1243243

#제출 시각아이디문제언어결과실행 시간메모리
1243243denislavElection (BOI18_election)C++20
0 / 100
1 ms576 KiB
# include <iostream> using namespace std; const int INF=1e9; const int MAX=5e5+11; int n,q; int a[MAX]; int pref[MAX]; struct node { int sum; int pref,pref_pos; int suf,suf_pos; node friend operator + (node A, node B) { if(A.sum==INF) return B; if(B.sum==INF) return A; node res; res.sum=A.sum+B.sum; if(A.pref<=A.sum+B.pref) { res.pref=A.pref; res.pref_pos=A.pref_pos; } else { res.pref=A.sum+B.pref; res.pref_pos=B.pref_pos; } if(B.suf<=A.suf+B.sum) { res.suf=B.suf; res.suf_pos=B.suf_pos; } else { res.suf=A.suf+B.sum; res.suf_pos=A.suf_pos; } return res; } }; node tree[MAX*4]; void build(int v=1, int l=1, int r=n) { if(l==r) { tree[v]={a[l],a[l],l,a[l],l}; 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 {INF,INF,INF,INF,INF}; 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); } bool ban[MAX]; int greedy(int l, int r) { int ans=0,balance=0; for(int i=l;i<=r;i++) { balance+=a[i]; if(balance==-1) { ans++; ban[i]=1; balance++; } } balance=0; for(int i=r;i>=l;i--) { if(ban[i]) continue; balance+=a[i]; if(balance==-1) { ans++; ban[i]=1; balance++; } } for(int i=l;i<=r;i++) ban[i]=0; return ans; } int main() { ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>n; for(int i=1;i<=n;i++) { char z; cin>>z; pref[i]=pref[i-1]; if(z=='C') a[i]=1; else { a[i]=-1; pref[i]++; } } build(); cin>>q; while(q--) { int l,r; cin>>l>>r; int ans=0; node nd=query(l,r); ans=max(ans,-nd.pref); ans=max(ans,-nd.suf); cout<<ans<<"\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...