Submission #80350

#TimeUsernameProblemLanguageResultExecution timeMemory
80350igziElection (BOI18_election)C++17
100 / 100
1488 ms105648 KiB
#include <bits/stdc++.h> #define maxN 500005 using namespace std; string s; int n,q,x,y; struct segment{ int a,l,d,x; }; segment seg[4*maxN]; void build(int n,int l,int d){ if(l==d){ if(s[l]=='T'){ seg[n].a=seg[n].l=seg[n].d=1; seg[n].x=-1; } else{ seg[n].a=seg[n].l=seg[n].d=0; seg[n].x=1; } } else{ int m=(l+d)/2; build(2*n,l,m); build(2*n+1,m+1,d); seg[n].l=max(seg[2*n].l,seg[2*n+1].l-seg[2*n].x); seg[n].d=max(seg[2*n+1].d,seg[2*n].d-seg[2*n+1].x); seg[n].x=seg[2*n].x+seg[2*n+1].x; seg[n].a=max(max(seg[2*n].a-seg[2*n+1].x,seg[2*n+1].a-seg[2*n].x),seg[2*n].l+seg[2*n+1].d); } } segment query(int n,int l,int d,int x,int y){ if(l>=x && d<=y) return seg[n]; int m=(l+d)/2; segment a,b,ans; a.a=a.l=a.d=a.x=b.a=b.l=b.d=b.x=0; if(m>=x) a=query(2*n,l,m,x,y); if(y>=m+1) b=query(2*n+1,m+1,d,x,y); ans.x=a.x+b.x; ans.l=max(a.l,b.l-a.x); ans.d=max(b.d,a.d-b.x); ans.a=max(max(a.a-b.x,b.a-a.x),a.l+b.d); return ans; } int main() { std::ios_base::sync_with_stdio(false); cin>>n; cin>>s; build(1,0,n-1); cin>>q; for(int i=0;i<q;i++){ cin>>x>>y; cout<<query(1,0,n-1,x-1,y-1).a<<endl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...