Submission #1311344

#TimeUsernameProblemLanguageResultExecution timeMemory
1311344matereElection (BOI18_election)C++20
0 / 100
4 ms3128 KiB
#include<bits/stdc++.h>
using namespace std;
int n,q,lg[500005];
pair<int,int>pref[2][21][500005];
pair<int,int> findmax(int l,int r,int tp){
    if(r<l) return {1e9,0};
    int pw=lg[r-l+1];
    pair<int,int>ans=min(pref[tp][pw][l],pref[tp][pw][r-(1<<pw)+1]);
    // if(ans.first>0) return {0,0};
    return ans;
}
int main(){
    cin>>n;
    string s;
    cin>>s;
    for(int i=2;i<=500000;i++) lg[i]=lg[i/2]+1;
    for(int i=1;i<=n;i++){
        pref[0][0][i].first=pref[0][0][i-1].first;
        if(s[i-1]=='T') pref[0][0][i].first--;
        else pref[0][0][i].first++;
        pref[0][0][i].second=i;
    }
    for(int i=n;i>=1;i--){
        pref[1][0][i].first=pref[1][0][i+1].first;
        if(s[i-1]=='T') pref[1][0][i].first--;
        else pref[1][0][i].first++;
        pref[1][0][i].second=-i;
    }
    for(int pw=1;pw<=19;pw++){
        for(int i=1;i<=n;i++){
            for(int nm:{0,1}){
                pref[nm][pw][i]=min(pref[nm][pw-1][i],pref[nm][pw-1][min(n,i+(1<<(pw-1)))]);
            }
        }
    }
    cin>>q;
    for(int i=1;i<=q;i++){
        int l,r;
        cin>>l>>r;
        pair<int,int> ind0=findmax(l,r,0),sh0=findmax(ind0.second+1,r,1);
        pair<int,int> ind1=findmax(l,r,1),sh1=findmax(l,-ind1.second-1,0);
        ind1.second*=-1;
        sh0.second*=-1;
        ind0.first-=pref[0][0][l-1].first;
        sh1.first-=pref[0][0][l-1].first;
        ind1.first-=pref[1][0][r+1].first;
        sh0.first-=pref[1][0][r+1].first;
        ind0.first=min(ind0.first,0);
        ind1.first=min(ind1.first,0);
        sh0.first=min(sh0.first,0);
        sh1.first=min(sh1.first,0);
        // cout<<"{"<<ind0.first<<","<<ind0.second<<"}"<<' ';
        // cout<<"{"<<sh0.first<<","<<sh0.second<<"}"<<'|';
        // cout<<"{"<<ind1.first<<","<<ind1.second<<"}"<<' ';
        // cout<<"{"<<sh1.first<<","<<sh1.second<<"}"<<endl;
        // cout<<l<<'-'<<r<<' ';
        cout<<-min(ind0.first+sh0.first,ind1.first+sh1.first)<<endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...