Submission #1089577

#TimeUsernameProblemLanguageResultExecution timeMemory
1089577noyancanturkElection (BOI18_election)C++17
100 / 100
528 ms49416 KiB
#include<bits/stdc++.h> using namespace std; #define pb push_back const int lim=5e5+100; struct{ int tree[4*lim],sum[4*lim]; int P,VAL; void update(int l,int r,int node){ if(l==r){ tree[node]=sum[node]=VAL; return; } int mid=l+r>>1,child=node<<1; if(P<=mid)update(l,mid,child); else update(mid+1,r,child|1); tree[node]=min(tree[child]+sum[child|1],tree[child|1]); sum[node]=sum[child]+sum[child|1]; } void update(int p,int val){ P=p,VAL=val; update(0,lim-1,1); } int query(int l,int r,int node){ if(r<=P)return tree[node]; int mid=l+r>>1,child=node<<1; if(P<mid+1)return query(l,mid,child)+sum[child|1]; int val1=tree[child]+sum[child|1],val2=query(mid+1,r,child|1); return min(val1,val2); } int query(int p){ P=p; return query(0,lim-1,1); } int sumquery(int l,int r,int node){ if(P<=l)return sum[node]; int mid=l+r>>1,child=node<<1; if(mid<P)return sumquery(mid+1,r,child|1); return sumquery(l,mid,child)+sum[child|1]; } int sumquery(int p){ P=p; return sumquery(0,lim-1,1); } }st; struct{ int tree[lim]; void update(int p,int val){ p++; while(p<lim){ tree[p]+=val; p+=p&-p; } } int query(int p){ p++; int res=0; while(p){ res+=tree[p]; p-=p&-p; } return res; } int query(int l,int r){ return query(r)-query(l-1); } }fw; int main(){ #ifdef Local freopen(".in","r",stdin); freopen(".out","w",stdout); #endif int n; cin>>n; string s; cin>>s; int m; cin>>m; int l[m],r[m],ans[m]; vector<int>queries[n]; for(int i=0;i<m;i++){ cin>>l[i]>>r[i]; l[i]--,r[i]--; queries[l[i]].pb(i); } stack<int>inds; for(int L=n-1;0<=L;L--){ if(s[L]=='C'){ st.update(L,1); if(inds.size()){ st.update(inds.top(),-1); fw.update(inds.top(),-1); inds.pop(); } }else{ inds.push(L); fw.update(L,1); } for(int j:queries[L]){ int R=r[j]; int val0=fw.query(L,R); int val1=st.query(R); int val2=st.sumquery(R+1); ans[j]=val0-min(0,val1-val2); } } for(int i:ans){ cout<<i<<"\n"; } }

Compilation message (stderr)

election.cpp: In member function 'void<unnamed struct>::update(int, int, int)':
election.cpp:15:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   15 |     int mid=l+r>>1,child=node<<1;
      |             ~^~
election.cpp: In member function 'int<unnamed struct>::query(int, int, int)':
election.cpp:27:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   27 |     int mid=l+r>>1,child=node<<1;
      |             ~^~
election.cpp: In member function 'int<unnamed struct>::sumquery(int, int, int)':
election.cpp:38:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   38 |     int mid=l+r>>1,child=node<<1;
      |             ~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...