답안 #400133

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
400133 2021-05-07T12:38:48 Z dxz05 가로등 (APIO19_street_lamps) C++14
40 / 100
555 ms 15016 KB
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize("unroll-loops")

#include <bits/stdc++.h>

using namespace std;

void debug_out() { cerr << endl; }

template<typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
    cerr << "[" << H << "]";
    debug_out(T...);
}

#ifdef dddxxz
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif

#define SZ(s) ((int)s.size())
#define all(x) (x).begin(), (x).end()
#define revall(x) (x).rbegin(), (x).rend()

clock_t startTime;

double getCurrentTime() {
    return (double) (clock() - startTime) / CLOCKS_PER_SEC;
}

typedef long long ll;
mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
const double eps = 0.00001;
const int MOD = 1e9 + 7;
const int INF = 1000000101;
const long long LLINF = 1223372000000000555;
const int N = 5e5 + 3e2;
const int M = 2222;

string street;
int n, q;
char qch[N];
int ql[N], qr[N];

void Subtask_1(){
    vector<vector<int>> cnt(n + 1, vector<int>(n + 1, 0));
    for (int i = 0; i <= n; i++){
        for (int j = i + 1; j <= n; j++){
            if (street[j - 1] == '0') break;
            cnt[i][j] = 1;
        }
    }

    for (int i = 1; i <= q; i++){
        if (qch[i] == 't'){ // toggle
            street[ql[i]] ^= '0' ^ '1';
        } else { // query
            cout << cnt[ql[i]][qr[i]] << endl;
        }

        for (int l = 0; l <= n; l++){
            for (int r = l + 1; r <= n; r++){
                if (street[r - 1] == '0') break;
                cnt[l][r]++;
            }
        }

    }

    exit(0);

}

void Subtask_2(){
    vector<int> cnt(n + 1), last(n + 1);
    for (int i = 0; i < n; i++){
        if (street[i] == '1') cnt[i] = 1, last[i] = 1; else
            last[i] = -1;
    }

    for (int i = 1; i <= q; i++){
        if (qch[i] == 't'){
            int x = ql[i];
            if (street[x] == '1'){
                cnt[x] += i - last[x];
                last[x] = -1;
            } else {
                last[x] = i;
            }

            street[x] ^= '0' ^ '1';

        } else {
            int l = ql[i];
            cout << cnt[l] + (last[l] != -1 ? i - last[l] : 0) << endl;
        }
    }

    exit(0);
}

struct SegTree{
    int size = 1;
    vector<int> tree;
    void build(int v, int tl, int tr){
        if (tl == tr){
            tree[v] = (street[tl] == '1' ? 0 : INF);
            return;
        }
        int tm = (tl + tr) >> 1;
        build(v + v, tl, tm);
        build(v + v + 1, tm + 1, tr);
        tree[v] = max(tree[v + v], tree[v + v + 1]);
    }

    void init(){
        while (size <= n) size *= 2;
        tree.resize(size * 2);
        build(1, 0, size - 1);
    }

    void update(int v, int tl, int tr, int pos, int val){
        if (tl == tr){
            tree[v] = val;
            return;
        }
        int tm = (tl + tr) >> 1;
        if (pos <= tm) update(v + v, tl, tm, pos, val); else
            update(v + v + 1, tm + 1, tr, pos, val);
        tree[v] = max(tree[v + v], tree[v + v + 1]);
    }

    void update(int pos, int val){
        update(1, 0, size - 1, pos, val);
    }

    int get(int v, int tl, int tr, int l, int r){
        if (l <= tl && tr <= r) return tree[v];
        if (tl > r || tr < l) return 0;
        int tm = (tl + tr) >> 1;
        return max(get(v + v, tl, tm, l, r), get(v + v + 1, tm + 1, tr, l, r));
    }

    int get(int l, int r){
        return get(1, 0, size - 1, l, r);
    }

};

void Subtask_4(){
    SegTree st;
    st.init();
    for (int i = 1; i <= q; i++){
        if (qch[i] == 't'){
            st.update(ql[i], i);
        } else {
            cout << max(0, i - st.get(ql[i], qr[i] - 1)) << endl;
        }
     //   for (int j = 0; j < n; j++) cout << st.get(j, j) << ' '; cout << endl;
    }

    exit(0);
}

void solve(int TC) {
    cin >> n >> q >> street;

    bool ok2 = true;
    for (int i = 1; i <= q; i++){
        string t;
        cin >> t >> ql[i];
        qch[i] = t[0];
        ql[i]--;
        if (qch[i] == 'q') {
            cin >> qr[i];
            qr[i]--;
            ok2 &= ql[i] == qr[i] - 1;
        }
    }

    if (n <= 100 && q <= 100){
        Subtask_1();
    }

    if (ok2){
        Subtask_2();
    }

    Subtask_4();

}


int main() {
    startTime = clock();
    cin.tie(nullptr); cout.tie(nullptr);
    ios_base::sync_with_stdio(false);

    bool llololcal = false;
#ifdef dddxxz
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    llololcal = true;
#endif

    int TC = 1;
    //cin >> TC;

    for (int test = 1; test <= TC; test++) {
        //debug(test);
        //cout << "Case #" << test << ": ";
        solve(test);
    }

    if (llololcal) cerr << endl << "Time: " << int(getCurrentTime() * 1000) << " ms" << endl;

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 1 ms 332 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Correct 3 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 299 ms 3784 KB Output is correct
2 Correct 306 ms 3880 KB Output is correct
3 Correct 302 ms 3896 KB Output is correct
4 Correct 315 ms 6360 KB Output is correct
5 Correct 366 ms 6716 KB Output is correct
6 Correct 260 ms 5716 KB Output is correct
7 Correct 546 ms 6256 KB Output is correct
8 Correct 555 ms 7640 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 2 ms 332 KB Output is correct
3 Correct 2 ms 332 KB Output is correct
4 Correct 3 ms 332 KB Output is correct
5 Runtime error 74 ms 15016 KB Execution killed with signal 11
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 332 KB Output is correct
2 Incorrect 2 ms 332 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 1 ms 332 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Correct 3 ms 332 KB Output is correct
8 Correct 299 ms 3784 KB Output is correct
9 Correct 306 ms 3880 KB Output is correct
10 Correct 302 ms 3896 KB Output is correct
11 Correct 315 ms 6360 KB Output is correct
12 Correct 366 ms 6716 KB Output is correct
13 Correct 260 ms 5716 KB Output is correct
14 Correct 546 ms 6256 KB Output is correct
15 Correct 555 ms 7640 KB Output is correct
16 Correct 1 ms 332 KB Output is correct
17 Correct 2 ms 332 KB Output is correct
18 Correct 2 ms 332 KB Output is correct
19 Correct 3 ms 332 KB Output is correct
20 Runtime error 74 ms 15016 KB Execution killed with signal 11
21 Halted 0 ms 0 KB -