제출 #580137

#제출 시각아이디문제언어결과실행 시간메모리
580137jmokutElection (BOI18_election)C++17
100 / 100
509 ms27996 KiB
#include <iostream>
#include <vector>
#include <iomanip>
#include "algorithm"
#include <cmath>
#include <set>
#include <queue>
#include <random>
#include <chrono>
#include "unordered_set"
#include <unordered_map>
#include "map"
#include "numeric"
#include "climits"
#include "bitset"

#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define max4(p, q, r, t) max(max(p, q), max(r, t))
#define max3(p, q, r) max(max(p, q), r)
#define testcases int t; cin>>t; while(t--)
using namespace std;

struct node {
    int pref{} ;
    int suff{};
    int sum{};
    int ans{};

    node() = default;

    node(int pref, int suff, int sum, int ans) : pref(pref), suff(suff), sum(sum), ans(ans) {};
};

const int N = 5e5 + 5;
node T[N << 2];
string s;


node pull(node &u, node &v) {
    int pref = max(u.pref, u.sum + v.pref);
    int suff = max(v.suff, v.sum + u.suff);
    int sum = u.sum + v.sum;
    int ans = max(u.pref + v.suff, max(u.ans + v.sum, v.ans + u.sum));
    return {pref, suff, sum, ans};
}

void pull(int v, int tl, int tr) {
    T[v] = pull(T[v << 1], T[v << 1 | 1]);
}

void build(int v, int tl, int tr) {
    if (tl == tr) {
        int val = s[tl] == 'C' ? -1 : 1;
        T[v].ans = max(0, val);
        T[v].pref = T[v].ans;
        T[v].suff = T[v].ans;
        T[v].sum = val;
        return;
    }
    int mid = (tl + tr) >> 1;
    build(v << 1, tl, mid);
    build(v << 1 | 1, mid + 1, tr);
    pull(v, tl, tr);
}


node get_ans(int v, int tl, int tr, int l, int r) {
    if (l == tl && r == tr) {
        return T[v];
    }
    int mid = (tl + tr) >> 1;
    if (r <= mid) {
        return get_ans(v << 1, tl, mid, l, r);
    }
    if (l > mid) {
        return get_ans(v << 1 | 1, mid + 1, tr, l, r);
    }
    node left = get_ans(v << 1, tl, mid, l, mid);
    node right = get_ans(v << 1 | 1, mid + 1, tr, mid + 1, r);

    return pull(left, right);
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n;
    cin >> n;
    cin >> s;

    build(1, 0, n - 1);

    int q;
    cin >> q;

    while (q--) {

        int l, r;
        cin >> l >> r;
        --l, --r;

        node ans = get_ans(1, 0, n - 1, l, r);

        cout << ans.ans << '\n';
    }

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...