Submission #90441

#TimeUsernameProblemLanguageResultExecution timeMemory
90441choikiwonElection (BOI18_election)C++17
100 / 100
1699 ms125088 KiB
#include<bits/stdc++.h>
using namespace std;

typedef pair<int, int> pii;

const int MN = 500010;

int N, Q;
char S[MN];
vector<pii> query[MN];
int ans[MN];

struct BIT {
    vector<pii> tree;
    vector<int> lazy;
    void init() {
        tree = vector<pii>(4 * N);
        lazy = vector<int>(4 * N, 0);
        build(0, N - 1, 1);
    }
    void build(int l, int r, int n) {
        if(l == r) {
            tree[n] = pii(0, l);
            return;
        }
        int m = (l + r)>>1;
        build(l, m, 2*n);
        build(m + 1, r, 2*n + 1);
        tree[n] = min(tree[2*n], tree[2*n + 1]);
    }
    void prop(int l, int r, int n) {
        if(l != r) {
            tree[2*n].first += lazy[n];
            lazy[2*n] += lazy[n];
            tree[2*n + 1].first += lazy[n];
            lazy[2*n + 1] += lazy[n];
            lazy[n] = 0;
        }
    }
    void upd(int a, int b, int d, int l, int r, int n) {
        if(b < l || r < a) return;
        if(a <= l && r <= b) {
            tree[n].first += d;
            lazy[n] += d;
            return;
        }
        prop(l, r, n);
        int m = (l + r)>>1;
        upd(a, b, d, l, m, 2*n);
        upd(a, b, d, m + 1, r, 2*n + 1);
        tree[n] = min(tree[2*n], tree[2*n + 1]);
    }
    pii quer(int a, int b, int l, int r, int n) {
        if(b < l || r < a) return pii(1e9, 1e9);
        if(a <= l && r <= b) return tree[n];
        prop(l, r, n);
        int m = (l + r)>>1;
        pii L = quer(a, b, l, m, 2*n);
        pii R = quer(a, b, m + 1, r, 2*n + 1);
        return min(L, R);
    }
    int kquer(int k, int l, int r, int n) {
        if(tree[n].first >= k) return -1;
        if(l == r) return l;
        prop(l, r, n);
        int m = (l + r)>>1;
        if(tree[2*n].first < k) return kquer(k, l, m, 2*n);
        else return kquer(k, m + 1, r, 2*n + 1);
    }
} bit1, bit2;

struct Fenwick {
    vector<int> tree;
    void init() {
        tree = vector<int>(N + 1, 0);
    }
    void upd(int idx, int val) {
        for(int i = idx + 1; i <= N; i += (i & -i)) tree[i] += val;
    }
    int quer(int a) {
        int ret = 0;
        for(int i = a + 1; i >= 1; i -= (i & -i)) ret += tree[i];
        return ret;
    }
    int quer(int a, int b) {
        return quer(b) - quer(a - 1);
    }
} fw;

int main() {
    scanf("%d\n", &N);

    for(int i = 0; i < N; i++) {
        scanf("%c", &S[i]);
    }

    scanf("%d", &Q);

    for(int i = 0; i < Q; i++) {
        int l, r; scanf("%d %d", &l, &r);
        l--; r--;

        query[l].push_back(pii(r, i));
    }

    bit1.init();
    bit2.init();
    for(int i = 0; i < N; i++) {
        bit1.upd(i, N - 1, S[i] == 'C'? 1 : -1, 0, N - 1, 1);
        bit2.upd(0, i, S[i] == 'C'? 1 : -1, 0, N - 1, 1);
    }

    fw.init();
    for(int i = 0; i < N; i++) {
        while(1) {
            int t = bit1.kquer(0, 0, N - 1, 1);
            if(t == -1) break;
            bit1.upd(t, N - 1, 1, 0, N - 1, 1);
            bit2.upd(0, t, 1, 0, N - 1, 1);
            fw.upd(t, 1);
        }

        for(int j = 0; j < query[i].size(); j++) {
            int r = query[i][j].first;
            int id = query[i][j].second;
            int t = bit2.quer(i, r, 0, N - 1, 1).first - (r == N - 1? 0 : bit2.quer(r + 1, r + 1, 0, N - 1, 1).first);
            ans[id] = fw.quer(i, r) + (t < 0? -t : 0);
        }

        int t = bit1.quer(i, i, 0, N - 1, 1).first;
        bit1.upd(i, N - 1, -t, 0, N - 1, 1);
    }

    for(int i = 0; i < Q; i++) {
        printf("%d\n", ans[i]);
    }
}

Compilation message (stderr)

election.cpp: In function 'int main()':
election.cpp:123:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int j = 0; j < query[i].size(); j++) {
                        ~~^~~~~~~~~~~~~~~~~
election.cpp:91:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d\n", &N);
     ~~~~~^~~~~~~~~~~~
election.cpp:94:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%c", &S[i]);
         ~~~~~^~~~~~~~~~~~~
election.cpp:97:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &Q);
     ~~~~~^~~~~~~~~~
election.cpp:100:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         int l, r; scanf("%d %d", &l, &r);
                   ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...