Submission #1232902

#TimeUsernameProblemLanguageResultExecution timeMemory
1232902almaharbas4Election (BOI18_election)C++20
100 / 100
807 ms35164 KiB
#include<bits/stdc++.h> using namespace std; struct Node { int suf; int pref; int sum; int ans; Node() : suf(0),pref(0),sum(0),ans(0){} Node(int s,int p,int ss,int a):suf(s),pref(p),sum(ss),ans(a){} }; vector<Node> seg(4*(5e5+1)); vector<char> s(5e5+2); Node merge(Node n,Node m) { Node parent; parent.sum=n.sum+m.sum; parent.pref=max(n.pref,n.sum+m.pref); parent.suf=max(m.suf,m.sum+n.suf); parent.ans=max({n.ans+m.sum,m.ans+n.sum,n.pref+m.suf}); return parent; } void update(int idx,int l,int r) { if(l==r) { if(s[l]=='T') seg[idx]=Node(1,1,1,1); else seg[idx]=Node(0,0,-1,0); 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(0,0,0,0); 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); return merge(n,m); } int main() { int len; cin>>len; for(int i=1;i<=len;i++) cin>>s[i]; update(1,1,len); int q; cin>>q; while(q--) { int l,r; cin>>l>>r; Node n=upit(1,1,len,l,r); cout<<n.ans<<'\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...