Submission #142543

#TimeUsernameProblemLanguageResultExecution timeMemory
142543imeimi2000Street Lamps (APIO19_street_lamps)C++17
100 / 100
4153 ms122732 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
 
using namespace std;
typedef long long llong;
typedef pair<int, int> pii;
 
void initv(vector<int> &v) {
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
}
 
struct fen1D {
    vector<llong> fen;
    vector<int> cp;
    void add(int x) {
        cp.push_back(x);
    }
    void init() {
        initv(cp);
        fen.resize(cp.size(), 0);
    }
    int find(int x) const {
        return lower_bound(cp.begin(), cp.end(), x) - cp.begin() + 1;
    }
    void update(int i, llong x) {
        i = find(i);
        while (i <= cp.size()) {
            fen[i - 1] += x;
            i += i & -i;
        }
    }
    llong query(int i) const {
        i = find(i);
        llong ret = 0;
        while (i) {
            ret += fen[i - 1];
            i -= i & -i;
        }
        return ret;
    }
};
 
struct fen2D {
    vector<fen1D> fen;
    vector<int> cp;
    void add1(int x) {
        cp.push_back(x);
    }
    void init1() {
        initv(cp);
        fen.resize(cp.size());
    }
    int find(int x) const {
        return lower_bound(cp.begin(), cp.end(), x) - cp.begin() + 1;
    }
    void add2(int x, int y) {
        x = find(x);
        while (x) {
            fen[x - 1].add(y);
            x -= x & -x;
        }
    }
    void init2() {
        for (fen1D &i : fen) i.init();
    }
    void update(int i, int j, llong x) {
        i = find(i);
        while (i <= cp.size()) {
            fen[i - 1].update(j, x);
            i += i & -i;
        }
    }
    llong query(int i, int j) const {
        i = find(i);
        llong ret = 0;
        while (i) {
            ret += fen[i - 1].query(j);
            i -= i & -i;
        }
        return ret;
    }
} fenM, fenB;
 
int n, q;
char in[300001];
int S[300001];
int A[300001];
int B[300001];
int L[300002];
int R[300002];
set<int> Rs;
 
void update(int x, int y, int v, int t) {
    fenM.update(x, -y, v);
    fenB.update(x, -y, -t * v);
}
 
void add(int x, int t) {
    int l = L[x], r = R[x + 1];
    update(l, x, -1, t);
    update(x + 1, r, -1, t);
    update(l, r, 1, t);
    L[l] = L[r] = l;
    R[l] = R[r] = r;
    Rs.erase(x);
}
 
void del(int x, int t) {
    int r = *Rs.lower_bound(x);
    int l = L[r];
    update(l, r, -1, t);
    update(l, x, 1, t);
    update(x + 1, r, 1, t);
    L[l] = L[x] = l;
    R[l] = R[x] = x;
    L[x + 1] = L[r] = x + 1;
    R[x + 1] = R[r] = r;
    Rs.insert(x);
}
 
int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> n >> q;
    cin >> in;
    for (int i = 1; i <= q; ++i) {
        char str[20];
        cin >> str;
        if (str[0] == 't') {
            cin >> A[i];
        }
        else {
            cin >> A[i] >> B[i];
            fenM.add1(A[i]);
            fenB.add1(A[i]);
        }
    }
    fenM.init1();
    fenB.init1();
    for (int i = 1; i <= q; ++i) if (B[i]) {
        fenM.add2(A[i], -B[i]);
        fenB.add2(A[i], -B[i]);
    }
    fenM.init2();
    fenB.init2();
    for (int i = 1; i <= n + 1; ++i) {
        L[i] = R[i] = i;
        Rs.insert(i);
        fenM.update(i, -i, 1);
        fenB.update(i, -i, 1);
    }
    for (int i = 1; i <= n; ++i) {
        S[i] = in[i - 1] - '0';
        if (S[i]) {
            add(i, 0);
        }
    }
    for (int i = 1; i <= q; ++i) {
        if (B[i]) {
            llong Mv = fenM.query(A[i], -B[i]);
            llong Bv = fenB.query(A[i], -B[i]);
            printf("%lld\n", Mv * i + Bv);
        }
        else {
            S[A[i]] ^= 1;
            if (S[A[i]]) add(A[i], i);
            else del(A[i], i);
        }
    }
    return 0;
}

Compilation message (stderr)

street_lamps.cpp: In member function 'void fen1D::update(int, llong)':
street_lamps.cpp:30:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (i <= cp.size()) {
                ~~^~~~~~~~~~~~
street_lamps.cpp: In member function 'void fen2D::update(int, int, llong)':
street_lamps.cpp:71:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (i <= cp.size()) {
                ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...