Submission #1203750

#TimeUsernameProblemLanguageResultExecution timeMemory
1203750nh0902Election (BOI18_election)C++20
0 / 100
1 ms832 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

const int N = 200010;

const int inf = 1e13;

int n, a[N], bit[N];

void update(int u, int v) {
    int idx = u;
    while (idx <= n) {
        bit[idx] += v;
        idx += (idx & (-idx));
    }
}

int getSum(int p) {
    int idx = p, ans = 0;
    while (idx > 0) {
        ans += bit[idx];
        idx -= (idx & (-idx));
    }
    return ans;
}

struct Segtree {
    vector<int> x, st, st_l, st_r;

    Segtree(int m) {
        x.assign(m, 0);
        st.assign(4 * m, 0);
        st_l.assign(4 * m, 0);
        st_r.assign(4 * m, 0);
    }

    void build(int id, int l, int r) {
        if (l == r) {
            st[id] = x[l];
            st_l[id] = l;
            st_r[id] = r;
            return;
        }

        int mid = (l + r) / 2;
        build(id * 2, l, mid);
        build(id * 2 + 1, mid + 1, r);

        st[id] = max(st[id * 2], st[id * 2 + 1]);
        if (st[id * 2] == st[id * 2 + 1]) {
            st_l[id] = st_l[id * 2];
            st_r[id] = st_r[id * 2 + 1];
        } else if (st[id * 2] < st[id * 2 + 1]) {
            st_l[id] = st_l[id * 2 + 1];
            st_r[id] = st_r[id * 2 + 1];
        } else {
            st_l[id] = st_l[id * 2];
            st_r[id] = st_r[id * 2];
        }
    }

    pair<int, int> get_l(int id, int l, int r, int u, int v) {
        if (r < u || v < l) return {- inf, 0};

        if (u <= l && r <= v) {
            return {st[id], st_l[id]};
        }

        int mid = (l + r) / 2;
        pair<int, int> ans_1 = get_l(id * 2, l, mid, u, v);
        pair<int, int> ans_2 = get_l(id * 2 + 1, mid + 1, r, u, v);

        if (ans_1.second < ans_2.second) return ans_2;
        return ans_1;
    }

    pair<int, int> get_r(int id, int l, int r, int u, int v) {
        if (r < u || v < l) return {- inf, 0};

        if (u <= l && r <= v) {
            return {st[id], st_r[id]};
        }

        int mid = (l + r) / 2;
        pair<int, int> ans_1 = get_r(id * 2, l, mid, u, v);
        pair<int, int> ans_2 = get_r(id * 2 + 1, mid + 1, r, u, v);

        if (ans_1.second > ans_2.second) return ans_1;
        return ans_2;
    }

} ;

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n;
    char c;
    for (int i = 1; i <= n; i ++) {
        cin >> c;
        if (c == 'T') {
            a[i] = 1;
            update(i, 1);
        } else {
            a[i] = - 1;
        }
    }

    Segtree seg1(n + 10), seg2(n + 10);

    int cur = 0;
    for (int i = 1; i <= n; i ++) {
        cur += a[i];
        seg1.x[i] = cur;
    }
    seg1.build(1, 1, n);

    cur = 0;
    for (int i = n; i >= 1; i --) {
        cur += a[i];
        seg2.x[i] = cur;
    }
    seg2.build(1, 1, n);

    int q, l, r;
    cin >> q;
    while (q --) {
        cin >> l >> r;
        pair<int, int> m1 = seg1.get_l(1, 1, n, l, r);
        pair<int, int> m2 = seg2.get_r(1, 1, n, l, r);

        if (m1.first == - inf && m2.first == - inf) {
            cout << 0 << "\n";
        } else if (m1.first == - inf) {
            cout << seg2.x[m2.second] - seg2.x[r + 1] << "\n";
        } else if (m2.first == - inf) {
            cout << seg1.x[m1.second] - seg1.x[l - 1] << "\n";
        } else {
            cout << max(seg1.x[m1.second] - seg1.x[l - 1], seg2.x[m2.second] - seg2.x[r + 1]) << "\n";
        }
    }

    return 0;
}







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