제출 #1232887

#제출 시각아이디문제언어결과실행 시간메모리
1232887almaharbas4Election (BOI18_election)C++20
0 / 100
3 ms320 KiB
#include<bits/stdc++.h> using namespace std; struct Node { int sum; int suf; int pref; Node() : sum(0),suf(1e9),pref(1e9){} }; vector<Node> seg; vector<int> val; Node merge(Node n,Node m) { Node parent; parent.sum=n.sum+m.sum; parent.pref=min(n.pref,n.sum+m.pref); parent.suf=min(m.suf,m.sum+n.suf); return parent; } void update(int idx,int l,int r) { if(l==r) { seg[idx].sum=val[l]; seg[idx].suf=val[l]; seg[idx].pref=val[l]; return; } int mid=(l+r)/2; update(2*idx,l,mid); update(2*idx+1,mid+1,r); seg[idx]=merge(seg[idx*2],seg[idx*2+1]); } Node upit(int idx,int start,int end,int l,int r) { if(r<start||l>end) return Node(); if(l<=start&&r>=end) { return seg[idx]; } int mid=(start+end)/2; Node n=upit(idx*2,start,mid,l,r); Node m=upit(idx*2+1,mid+1,end,l,r); if(n.sum==0&&n.pref==1e9&&n.suf==1e9) return m; if(m.sum==0&&m.pref==1e9&&m.suf==1e9) return n; return merge(n,m); } int main() { int len; cin>>len; seg.resize(4*len); val.resize(len); string s; cin>>s; for(int i=0;i<len;i++) val[i]=((s[i]=='T')?-1:1); update(1,0,len-1); int q; cin>>q; while(q--) { int l,r; cin>>l>>r; l--;r--; Node n=upit(1,0,len-1,l,r); int left=max(0,-n.pref); int right=max(0,-n.suf); cout<<max(left,right)<<'\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...