답안 #1005127

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1005127 2024-06-22T07:37:34 Z vjudge1 가로등 (APIO19_street_lamps) C++17
40 / 100
421 ms 25364 KB
#include <bits/stdc++.h>
using namespace std;

const int N = 3e5 + 10;
int n, q, store[N], at[N], seg[N];
string s;
pair<int, int> last[N];

void modify(int p, int x, int v = 1, int s = 0, int e = n){
    if (e - s == 1){
        seg[v] = x;
        return;
    }

    int mid = (s + e) / 2, lc = 2 * v, rc = lc + 1;

    if (p < mid) modify(p, x, lc, s, mid);
    else modify(p, x, rc, mid, e);

    seg[v] = max(seg[lc], seg[rc]);
}

int get(int l, int r, int v = 1, int s = 0, int e = n){
    if (r <= s || e <= l) return 0;
    if (l <= s && e <= r) return seg[v];

    int mid = (s + e) / 2, lc = 2 * v, rc = lc + 1;

    return max(get(l, r, lc, s, mid), get(l, r, rc, mid, e));
}

int main(){
    cin >> n >> q >> s;

    if (n <= 100 and q <= 100){
        vector<string> vec;
        vec.push_back(s);
        for (int i = 0; i < q; i ++){
            string qx;
            cin >> qx;

            if (qx[0] == 't'){
                int x;
                cin >> x;
                x--;
                s[x] = '1' - s[x] + '0';
            }
            else{
                int a, b;
                cin >> a >> b;
                a--, b--;

                int ans = 0;
                for (string x : vec){
                    bool good = 1;
                    for (int i = a; i < b; i ++)
                        if (x[i] == '0')
                            good = 0;
                    ans += good;
                }

                cout << ans << endl;
            }
            vec.push_back(s);    
        }
        return 0;
    }

    bool subtask2 = 1;
    vector<pair<string, pair<int, int>>> query;
    for (int i = 0; i < q; i ++){
        string qx;
        int x, y;
        cin >> qx >> x;
        if (qx[0] == 'q')
            cin >> y; 
        query.push_back({qx, {x, y}});

        if (qx[0] == 'q' and (y - x) > 1)
            subtask2 = 0;
    }

    if (subtask2){
        for (int i = 0; i < n; i ++)
            if (s[i] == '1')
                last[i] = {0, -1};

        int tme = 0;
        for (int i = 0; i < q; i ++){
            string qx = query[i].first;

            if (qx[0] == 't'){
                int x;
                x = query[i].second.first;
                x--;
                
                if (s[x] == '1'){
                    last[x].second = tme;
                    s[x] = '0';
                    store[x] += last[x].second - last[x].first + 1;
                }
                else{
                    last[x] = {tme + 1, -1};
                    s[x] = '1';
                }
            }
            else{
                int a = query[i].second.first, b = query[i].second.second;
                a--, b--;

                int val = 0;
                if (last[a].second == -1 and last[a].first != -1)
                    val = tme - last[a].first + 1;

                // cout << a << " : " << last[a].first << " " << last[a].second << ", cur time = " << tme << endl;

                cout << store[a] + val << endl;
            }
            tme++;
        }
        return 0;
    }

    for (int i = 0; i <= n; i ++){
        at[i] = n + 10;
        modify(i, n + q + 10);
    }

    int tme = 0;
    for (int i = 0; i < q; i ++){
        string qx = query[i].first;

        if (qx[0] == 't'){
            int x = query[i].second.first;
            x--;
            at[x] = tme + 1;
            modify(x, tme + 1);
        }
        else{
            int a = query[i].second.first;
            int b = query[i].second.second;
            a--, b--;

            int mx = get(a, b);
            cout << tme - mx + 1 << endl;
        }
        tme++;
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2396 KB Output is correct
2 Correct 0 ms 2396 KB Output is correct
3 Correct 1 ms 2396 KB Output is correct
4 Correct 1 ms 2396 KB Output is correct
5 Correct 0 ms 2396 KB Output is correct
6 Correct 1 ms 2396 KB Output is correct
7 Correct 1 ms 2396 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 247 ms 23220 KB Output is correct
2 Correct 272 ms 23220 KB Output is correct
3 Correct 272 ms 23216 KB Output is correct
4 Correct 254 ms 25328 KB Output is correct
5 Correct 287 ms 25364 KB Output is correct
6 Correct 223 ms 25096 KB Output is correct
7 Correct 403 ms 23820 KB Output is correct
8 Correct 421 ms 24080 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 2396 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 2396 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2396 KB Output is correct
2 Correct 0 ms 2396 KB Output is correct
3 Correct 1 ms 2396 KB Output is correct
4 Correct 1 ms 2396 KB Output is correct
5 Correct 0 ms 2396 KB Output is correct
6 Correct 1 ms 2396 KB Output is correct
7 Correct 1 ms 2396 KB Output is correct
8 Correct 247 ms 23220 KB Output is correct
9 Correct 272 ms 23220 KB Output is correct
10 Correct 272 ms 23216 KB Output is correct
11 Correct 254 ms 25328 KB Output is correct
12 Correct 287 ms 25364 KB Output is correct
13 Correct 223 ms 25096 KB Output is correct
14 Correct 403 ms 23820 KB Output is correct
15 Correct 421 ms 24080 KB Output is correct
16 Incorrect 1 ms 2396 KB Output isn't correct
17 Halted 0 ms 0 KB -