제출 #158656

#제출 시각아이디문제언어결과실행 시간메모리
158656PeppaPig가로등 (APIO19_street_lamps)C++14
100 / 100
1645 ms76484 KiB
#include <bits/stdc++.h>

#define iii tuple<int, int, int>

using namespace std;

const int N = 3e5+5;

void update(vector<int> &t, int x, int k) {
    for(int i = x; i < t.size(); i += i & -i)
        t[i] += k;
}

int query(vector<int> &t, int x) {
    int ret = 0;
    for(int i = x; i; i -= i & -i)
        ret += t[i];
    return ret;
}

int n, q, state[N];
char str[N];
set<iii> S;
vector<iii> ask;
vector<int> coord[N], t[N];

void update_2d(int x, int l, int r, int k) {
    for(int i = x; i <= n; i += i & -i) {
        auto it = lower_bound(coord[i].begin(), coord[i].end(), l + 1);
        if(it == coord[i].begin()) update(t[i], 1, k);
        else if(it != coord[i].end()) update(t[i], it - coord[i].begin(), k);
        it = upper_bound(coord[i].begin(), coord[i].end(), r);
        if(it != coord[i].end()) update(t[i], it - coord[i].begin() + 1, -k);
    }
}

int query_2d(int l, int r) {
    int ret = 0;
    for(int i = l; i; i -= i & -i) {
        int idx = lower_bound(coord[i].begin(), coord[i].end(), r) - coord[i].begin() + 1;
        ret += query(t[i], idx);
    }
    return ret;
}

void set_time(iii seg, int time) {
    int l, r, t; tie(l, r, t) = seg;
    update_2d(l, l, r, time - t);
    update_2d(r + 1, l, r, t - time);
}

int main() {
    scanf("%d %d %s", &n, &q, str + 1);
    for(int i = 1; i <= n; i++) state[i] = (str[i] == '1'); 
    for(int i = 1, j; i <= n + 1; i = j + 1) {
        for(j = i; state[j] && j <= n; j++);
        S.emplace(i, j, 0);
    }
    for(int i = 1; i <= q; i++) {
        char T[10];
        int a, b;
        scanf(" %s", T);
        if(T[0] == 't') {
            scanf("%d", &a);
            ask.emplace_back(0, a, 0);
        } else {
            scanf("%d %d", &a, &b);
            for(int j = a; j; j -= j & -j) coord[j].emplace_back(b);
            ask.emplace_back(1, a, b);
        }
    }
    for(int i = 1; i <= n; i++) {
        sort(coord[i].begin(), coord[i].end());
        coord[i].resize(unique(coord[i].begin(), coord[i].end()) - coord[i].begin());
        if(coord[i].size()) t[i].resize(coord[i].size() + 1);
    }
    int time = 0;
    for(iii p : ask) {
        ++time;
        int T, a, b; tie(T, a, b) = p;
        auto find = [&](int x) { return *prev(S.lower_bound({x + 1, 0, 0})); };
        if(T == 0) {
            if(state[a]) {
                iii seg = find(a);
                set_time(seg, time);
                S.erase(seg);
                S.emplace(get<0>(seg), a, time), S.emplace(a + 1, get<1>(seg), time);
            } else {
                iii seg_l = find(a), seg_r = find(a + 1);
                set_time(seg_l, time), set_time(seg_r, time);
                S.erase(seg_l), S.erase(seg_r);
                S.emplace(get<0>(seg_l), get<1>(seg_r), time);
            }
            state[a] ^= 1;
        } else {
            int ans = query_2d(a, b);
            iii seg = find(a);
            if(get<1>(seg) >= b) ans += time - get<2>(seg);
            printf("%d\n", ans);
        }
    }

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

street_lamps.cpp: In function 'void update(std::vector<int>&, int, int)':
street_lamps.cpp:10:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = x; i < t.size(); i += i & -i)
                    ~~^~~~~~~~~~
street_lamps.cpp: In function 'int main()':
street_lamps.cpp:53:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %s", &n, &q, str + 1);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
street_lamps.cpp:62:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf(" %s", T);
         ~~~~~^~~~~~~~~~
street_lamps.cpp:64:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d", &a);
             ~~~~~^~~~~~~~~~
street_lamps.cpp:67:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d %d", &a, &b);
             ~~~~~^~~~~~~~~~~~~~~~~
#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...