제출 #294222

#제출 시각아이디문제언어결과실행 시간메모리
2942226arenElection (BOI18_election)C++14
100 / 100
1099 ms33100 KiB
#include <bits/stdc++.h>
using namespace std;

#define all(s) s.begin(), s.end()
#define pb push_back
#define ii pair<int, int>
#define x first
#define y second
#define bit(x, y) ((x >> y) & 1)

const int N = 500005;

int it[4 * N], lazy[4 * N];
int pref[N], suff[N], n, q;

void build(int k, int l, int r) {
    if (l == r) {
        it[k] = suff[l];
        return;
    }
    int mid = (l + r) / 2;
    build(2 * k, l, mid);
    build(2 * k + 1, mid + 1, r);
    it[k] = min(it[2 * k], it[2 * k + 1]);
}

void down(int k) {
    int val = lazy[k];
    if (val == 0) return;
    it[2 * k] += val;
    it[2 * k + 1] += val;
    lazy[2 * k] += val;
    lazy[2 * k + 1] += val;
    lazy[k] = 0;
    return;
}

void update(int k, int l, int r, int u, int v, int val) {
    if (l > v || r < u) return;
    if (l >= u && r <= v) {
        it[k] += val;
        lazy[k] += val;
        return;
    }
    down(k);
    int mid = (l + r) / 2;
    update(2 * k, l, mid, u, v, val);
    update(2 * k + 1, mid + 1, r, u, v, val);
    it[k] = min(it[2 * k], it[2 * k + 1]);
}

int get(int k, int l, int r, int u, int v) {
    if (l > v || r < u) return 1e9;
    if (l >= u && r <= v) return it[k];
    down(k);
    int mid = (l + r) / 2;
    int g1 = get(2 * k, l, mid, u, v);
    int g2 = get(2 * k + 1, mid + 1, r, u, v);
    return min(g1, g2);
}

vector<int> eli_id;

void add(int id) {
    while (pref[eli_id.back()] >= pref[id]) {
        update(1, 1, n, 1, eli_id.back(), -1);
        eli_id.pop_back();
    }
    update(1, 1, n, 1, id, 1);
    eli_id.pb(id);
}


int main() {
    ios::sync_with_stdio(false); cin.tie(0); 
    cout.tie(0);
    cin >> n;
    string s;
    cin >> s;
    s = " " + s;
    for (int i = 1; i <= n; i++) {
        if (s[i] == 'C') pref[i] = pref[i - 1] + 1;
        else pref[i] = pref[i - 1] - 1;
    }
    for (int i = n; i > 0; i--) {
        if (s[i] == 'C') suff[i] = suff[i + 1] + 1;
        else suff[i] = suff[i + 1] - 1;
    }
    pref[n + 1] = -1e9;
    eli_id.pb(n + 1);

    build(1, 1, n);
    
    cin >> q;
    vector<pair<ii, int>> que;
    vector<int> ans(q);
    for (int i = 0; i < q; i++) {
        ii u;
        cin >> u.x >> u.y;
        que.pb({u, i});
    }
    sort(que.rbegin(), que.rend());

    int cur = n + 1;
    for (auto qu : que) {
        int l = qu.x.x;
        int r = qu.x.y;
        int id = qu.y;
        while (cur >= l) {
            cur--;
            add(cur);
        }
        // cout << cur << endl;
        // for (int e : eli_id) cout << e << ' ';
        // cout << endl;
        // get the number of id <= r
        ans[id] = eli_id.end() - lower_bound(eli_id.begin(), eli_id.end(), r, greater<int>()) - 1;
        // cout << ans[id] << endl;
        int pivot = suff[r + 1];
        if (r != n) pivot = get(1, 1, n, r + 1, r + 1);

        ans[id] += max(0, pivot - get(1, 1, n, l, r));
    }
    
    for (int i = 0; i < q; i++) cout << ans[i] << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...