Submission #1314502

#TimeUsernameProblemLanguageResultExecution timeMemory
1314502boclobanchatElection (BOI18_election)C++20
100 / 100
590 ms44628 KiB
#include<bits/stdc++.h> using namespace std; const int MAXN=5e5+5; pair<int,int> seg[MAXN*4]; int nex[MAXN],pref[MAXN],f[MAXN*2],ans[MAXN]; vector< pair<int,int> > vq[MAXN]; stack<int> st; pair<int,int> merge(pair<int,int> a,pair<int,int> b) { return {a.first+b.first,min(b.second,b.first+a.second)}; } void update(int l,int r,int i,int val,int pos) { if(i<l||r<i) return ; if(l==r) { seg[pos]={seg[pos].first+val,min(0,seg[pos].first+val)}; return ; } int mid=(l+r)/2; update(l,mid,i,val,pos*2); update(mid+1,r,i,val,pos*2+1); seg[pos]=merge(seg[pos*2],seg[pos*2+1]); } pair<int,int> get(int l,int r,int u,int v,int pos) { if(u<=l&&r<=v) return seg[pos]; int mid=(l+r)/2; if(v<=mid) return get(l,mid,u,v,pos*2); if(mid+1<=u) return get(mid+1,r,u,v,pos*2+1); return merge(get(l,mid,u,v,pos*2),get(mid+1,r,u,v,pos*2+1)); } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,q; string s; cin>>n>>s>>q; s=' '+s; for(int i=0;i<=n*2;i++) f[i]=n+1; for(int i=1;i<=n;i++) pref[i]=pref[i-1]+(s[i]=='C')-(s[i]=='T'); for(int i=n-1;i+1;i--) f[pref[i+1]+n]=i+1,nex[i]=f[pref[i]+n-1]; for(int i=1;i<=q;i++) { int l,r; cin>>l>>r; vq[l].push_back({r,i}); } for(int i=n;i;i--) { update(1,n,i,(s[i]=='C')-(s[i]=='T'),1); while(!st.empty()&&nex[i-1]>=st.top()) update(1,n,st.top(),-1,1),st.pop(); if(nex[i-1]<=n) { st.push(nex[i-1]); update(1,n,nex[i-1],1,1); } for(auto v:vq[i]) ans[v.second]=get(1,n,i,v.first,1).first-(pref[v.first]-pref[i-1])-get(1,n,i,v.first,1).second; } for(int i=1;i<=q;i++) cout<<ans[i]<<"\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...