Submission #1336627

#TimeUsernameProblemLanguageResultExecution timeMemory
1336627sh_qaxxorov_571Election (BOI18_election)C++20
0 / 100
1 ms344 KiB
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

/**
 * Segment Tree har bir tugunida 4 ta qiymat saqlaydi:
 * sum: jami balans (C=+1, T=-1)
 * pref: eng kichik prefiks balans
 * suff: eng kichik suffiks balans
 * ans: o'chirilishi kerak bo'lgan minimal ovozlar
 */
struct Node {
    int sum, pref, suff, ans;
};

// Ikki segmentni birlashtirish funksiyasi
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 mantiq: ans = max(chap_ans + o'ng_sum, o'ng_ans + chap_sum, chap_pref + o'ng_suff)
    // Bu formula prefiks va suffiks shartlarini bir vaqtda hisobga oladi
    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) {
        if (s[start - 1] == 'C') {
            // Cap (+1) bo'lsa: pref/suff 0 (minimum kamaymaydi), ans 0
            tree[node] = {1, 0, 0, 0};
        } else {
            // Tony (-1) bo'lsa: pref/suff -1, ans 1 (chunki uni o'chirish kerak)
            tree[node] = {-1, -1, -1, 1};
        }
        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 (l <= start && end <= r) return tree[node];
    int mid = (start + end) / 2;
    if (r <= mid) return query(2 * node, start, mid, l, r);
    if (l > mid) return query(2 * node + 1, mid + 1, end, l, r);
    return merge(query(2 * node, start, mid, l, r), query(2 * node + 1, mid + 1, end, l, r));
}

int main() {
    // Tezkor kiritish-chiqarish
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    if (!(cin >> N >> s >> Q)) return 0;

    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);
        // ans - bu o'chirilishi shart bo'lgan minimal ovozlar soni
        cout << res.ans << "\n";
    }

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