Submission #1232899

#TimeUsernameProblemLanguageResultExecution timeMemory
1232899AdnanboiElection (BOI18_election)C++20
0 / 100
1 ms320 KiB
#include <bits/stdc++.h>

using namespace std;

const int MOD = 1e9 + 7;

int N;
vector<int> P, PR;
vector<int> segF, segB;

void buildF(int v, int l, int r) {
    if(l == r){
        segF[v] = P[l];
    } 
    else{
        int m = (l + r) / 2;
        buildF(v * 2, l, m);
        buildF(v * 2 + 1, m + 1, r);
        segF[v] = min(segF[v * 2], segF[v * 2 + 1]);
    }
}

int queryF(int v, int l, int r, int ql, int qr) {
    if(ql > r || qr < l) return INT_MAX;
    if(ql <= l && r <= qr) return segF[v];
    int m = (l + r) / 2;
    return min(queryF(v * 2, l, m, ql, qr),
        		   queryF(v * 2 + 1, m + 1, r, ql, qr)
    );
}

void buildB(int v, int l, int r) {
    if(l == r) {
        segB[v] = PR[l];
    } 
    else{
        int m = (l + r) / 2;
        buildB(v * 2, l, m);
        buildB(v * 2 + 1, m + 1, r);
        segB[v] = min(segB[v * 2], segB[v * 2 + 1]);
    }
}

int queryB(int v, int l, int r, int ql, int qr) {
    if(ql > r || qr < l) return INT_MAX;
    if(ql <= l && r <= qr) return segB[v];
    int m = (l + r) / 2;
    return min(queryB(v * 2, l, m, ql, qr),
        		   queryB(v * 2 + 1, m + 1, r, ql, qr)
    );
}

void solve(){
    cin>>N;
    string S;
    cin>>S;
    P.assign(N + 1, 0);
    PR.assign(N + 2, 0);
    for(int i = 1; i <= N; i++){
        P[i] = P[i - 1] + (S[i - 1] == 'C' ? 1 : -1);
    }
    for(int i = N; i >= 1; i--){
        PR[N - i + 1] = PR[N - i] + (S[i - 1] == 'C' ? 1 : -1);
    }
    segF.assign(4 * N, INT_MAX);
    segB.assign(4 * N, INT_MAX);
    buildF(1, 1, N);
    buildB(1, 1, N);
    int Q;
    cin>>Q;
    while(Q--){
        int L, R;
        cin>>L>>R;
        int baseF = P[L - 1];
        int mnF = queryF(1, 1, N, L, R);
        int delF = max(0, baseF - mnF);
        int Lp = N - R + 1;
        int Rp = N - L + 1;
        int baseB = PR[Lp - 1];
        int mnB = queryB(1, 1, N, Lp, Rp);
        int delB = max(0, baseB - mnB);
        cout<<max(delF, delB)<<'\n';
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int t = 1;
    //cin>>t;
    while(t--){
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...