Submission #1269737

#TimeUsernameProblemLanguageResultExecution timeMemory
1269737yanbElection (BOI18_election)C++20
100 / 100
1586 ms76080 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
using pii = pair<int, int>;
using t3i = tuple<int, int, int>;

struct Node {
    int mn, mx, ans, s;

    Node() : mn(1e9), mx(-1e9), ans(0), s(0) {}

    Node(int mn, int mx, int ans, int s) : mn(mn), mx(mx), ans(ans), s(s) {}

    Node(int x) : mn(min(0ll, x)), mx(max(0ll, x)), ans(max(0ll, x)), s(x) {}

    Node operator+(const Node &o) const {
        return Node(min(mn, s + o.mn), max(mx, s + o.mx), max({ans, o.ans, s + o.mx - mn}), s + o.s);
    }
};

struct Tree {
    int n;
    vector<Node> st;

    Tree(int n, vector<int> &a) : n(n), st(4 * n) {
        _build(a, 1, 0, n - 1);
    }

    void _build(vector<int> &a, int v, int vl, int vr) {
        if (vl == vr) {
            st[v] = Node(a[vl]);
            return;
        }
        int vm = (vl + vr) / 2;
        _build(a, v * 2, vl, vm);
        _build(a, v * 2 + 1, vm + 1, vr);
        st[v] = st[v * 2] + st[v * 2 + 1];
    }

    Node _get(int l, int r, int v, int vl, int vr) {
        if (l <= vl && vr <= r) return st[v];
        if (r < vl || vr < l) return Node();
        int vm = (vl + vr) / 2;
        return _get(l, r, v * 2, vl, vm) + _get(l, r, v * 2 + 1, vm + 1, vr);
    }

    int get(int l, int r) {
        return _get(l, r, 1, 0, n - 1).ans;
    }
};

signed main() {
    int n;
    cin >> n;
    string s;
    cin >> s;
    int q;
    cin >> q;

    vector<int> a(n);
    for (int i = 0; i < n; i++) a[i] = (s[i] == 'C' ? 1 : -1);

    vector<int> pref(n + 1);
    for (int i = 0; i < n; i++) {
        pref[i + 1] = pref[i] + a[i];
    }

    Tree st(n, a);

    while (q--) {
        int l, r;
        cin >> l >> r;
        l--; r--;
        cout << st.get(l, r) - pref[r + 1] + pref[l] << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...