Submission #1266200

#TimeUsernameProblemLanguageResultExecution timeMemory
1266200warrennElection (BOI18_election)C++20
100 / 100
937 ms66540 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long 

struct isi{
    int sum,pref,suf,ans;
};

string s;
vector<isi>st;

isi merg(isi a,isi b){
    // cout<<a.sum<<" "<<a.pref<<" "<<a.suf<<" "<<a.ans<<endl;
    // cout<<b.sum<<" "<<b.pref<<" "<<b.suf<<" "<<b.ans<<endl;
    isi akh;
    akh.sum=a.sum+b.sum;
    akh.pref=min(a.sum+b.pref,a.pref);
    akh.suf=min(b.sum+a.suf,b.suf);
    akh.ans=max({a.ans-(b.sum),b.ans-(a.sum),-(a.pref+b.suf)});
    //cout<<akh.sum<<" "<<akh.pref<<" "<<akh.suf<<" "<<akh.ans<<endl;
    return akh;
}

void build(int idx,int l,int r){
    if(l==r){
        if(s[l]=='C'){
            st[idx]={1,0,0,0};
        }
        else{
            st[idx]={-1,-1,-1,1};
        }
        return;
    }
    int mid=(l+r)/2;
    build(2*idx,l,mid);
    build(2*idx+1,mid+1,r);
    st[idx]=merg(st[2*idx],st[2*idx+1]);
    
}

isi query(int idx,int l,int r,int posl,int posr){
    if(l>=posl && r<=posr)return st[idx];
    if(l>posr || r<posl)return {0,0,0,0};
    int mid=(l+r)/2;
    return merg(query(2*idx,l,mid,posl,posr),query(2*idx+1,mid+1,r,posl,posr));
}

signed main(){
    int n;
    cin>>n;
    cin>>s;
    s="."+s;
    st=vector<isi>(4*n+1);
    build(1,1,n);
    int qu;
    cin>>qu;
    while(qu--){
        int l,r;
        cin>>l>>r;
        cout<<query(1,1,n,l,r).ans<<endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...