제출 #1336626

#제출 시각아이디문제언어결과실행 시간메모리
1336626sh_qaxxorov_571Election (BOI18_election)C++20
0 / 100
1 ms344 KiB
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

struct Node {
    int sum, pref, suff, ans;
};

Node merge(const Node& a, const Node& b) {
    Node res;
    res.sum = a.sum + b.sum;
    res.pref = min(a.pref, a.sum + b.pref);
    res.suff = min(b.suff, b.sum + a.suff);
    // Asosiy formula: bekor qilinadigan minimal ovozlar
    res.ans = max({a.ans + b.sum, b.ans + a.sum, a.pref + b.suff});
    return res;
}

int N, Q;
string s;
vector<Node> tree;

void build(int node, int start, int end) {
    if (start == end) {
        int val = (s[start - 1] == 'C' ? 1 : -1);
        tree[node] = {val, min(0, val), min(0, val), (val == -1 ? 1 : 0)};
        return;
    }
    int mid = (start + end) / 2;
    build(2 * node, start, mid);
    build(2 * node + 1, mid + 1, end);
    tree[node] = merge(tree[2 * node], tree[2 * node + 1]);
}

Node query(int node, int start, int end, int l, int r) {
    if (r < start || end < l) return {0, 0, 0, 0};
    if (l <= start && end <= r) return tree[node];
    int mid = (start + end) / 2;
    return merge(query(2 * node, start, mid, l, r), query(2 * node + 1, mid + 1, end, l, r));
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> N >> s >> Q;
    tree.resize(4 * N + 1);
    build(1, 1, N);

    while (Q--) {
        int L, R;
        cin >> L >> R;
        Node res = query(1, 1, N, L, R);
        cout << res.ans << "\n";
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...