답안 #977824

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
977824 2024-05-08T11:33:27 Z ZHIRDILBILDIZ 가로등 (APIO19_street_lamps) C++14
0 / 100
522 ms 127084 KB
#include <bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#define pll pair<ll, ll>
#define pii pair<int, int>

using namespace std;
const int N = 3e5 + 10;

int p[N];
int ans[N];
set<int> qr[N];
vector<int> gr[N];
void init(int _sz) {
    for (int i = 1; i <= _sz; ++i)
        p[i] = i,
            gr[i].push_back(i);
}
void join (int u, int v, int w) {
    u = p[u];
    v = p[v];
    if (u == v)
        return;
    if (gr[u].size() + qr[u].size() > gr[v].size() + qr[v].size())
        swap(u, v);
    for (int i : gr[u]) {
        p[i] = v;
        gr[v].push_back(i);
    }
    for (int i : qr[u])
        if (qr[v].find(i) != qr[v].end())
            ans[i] = max(ans[i], w - i);
        else
            qr[v].insert(i);
}
signed main () {
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    int t = 1;
    while (t--) {
        int n, q;
        cin >> n >> q;
        char a[n + 1];
        char for_sub3[n + 1];
        for (int i = 1; i <= n; ++i) {
            cin >> a[i];
            for_sub3[i] = a[i];
        }
        bool sub2 = 1;
        bool sub3 = 1;
        string type[q + 1];
        int c[q + 1], d[q + 1];
        bool abu[q + 1] = {};

        for (int i = 1; i <= q; ++i) {
            cin >> type[i] >> c[i];
            if (type[i] == "query") {
                cin >> d[i];
                abu[i] = 1;
                if (d[i] - c[i] != 1)
                    sub2 = 0;
            } else {
                if (for_sub3[c[i]] == '1')
                    sub3 = 0;
                else
                    for_sub3[c[i]] = '1';
            }
        }

        if (sub3) {
            init(n + 1);

            for (int i = 1; i <= q; ++i)
                if (type[i] == "query")
                    qr[c[i]].insert(i),
                        qr[d[i]].insert(i);

            for (int i = 1; i <= n; ++i)
                if (a[i] == '1')
                    join(i, i + 1, 0);

            for (int i = 1; i <= q; ++i)
                if (type[i] == "toggle")
                    join(c[i], c[i] + 1, i);

            for (int i = 1; i <= q; ++i)
                if (abu[i])
                    cout << ans[i] << '\n';
            continue;
        }

        if (sub2) {
            vector<pair<bool, int>> query[n + 1];

            for (int i = 1; i <= q; ++i)
                if (type[i] == "toggle")
                    query[c[i]].push_back({0, i});
                else
                    query[c[i]].push_back({1, i});

            for (int i = 1; i <= n; ++i) {
                pair<char, int> now = {a[i], 0};
                int cnt = 0;
                now = {a[i], 0};
                for (auto j : query[i]) {
                    if (j.fi) {
                        ans[j.se] = cnt + (now.fi == '1') * (j.se - now.se);
                    } else {
                        if (now.fi == '1') {
                            cnt += (j.se - now.se);
                            now.fi = '0';
                        } else {
                            now.fi = '1';
                        }
                        now.se = j.se;
                    }
                }
            }
            for (int i = 1; i <= q; ++i)
                if (abu[i])
                    cout << ans[i] << '\n';
            continue;
        }

        if (n <= 100 && q <= 100) {
            bool b[n + 1][q + 1] = {};
            for (int j = 1; j <= n; ++j)
                b[j][0] = a[j] - '0';
            for (int i = 1; i <= q; ++i) {
                if (type[i] == "toggle") {
                    if (a[c[i]] == '1')
                        a[c[i]] = '0';
                    else
                        a[c[i]] = '1';
                }
                for (int j = 1; j <= n; ++j)
                    b[j][i] = a[j] - '0';
                if (type[i] == "query") {
                    int ans = 0;
                    for (int j = 0; j < i; ++j) {
                        bool flag = 1;
                        for (int z = c[i]; z < d[i]; ++z)
                            flag &= (b[z][j]);
                        ans += flag;
                    }
                    cout << ans << '\n';
                }
            }
            continue;
        }

    }

    return 0;
}

// 10 5
// 1101110100
// query 1 2
// toggle 1
// query 2 3
// toggle 1
// query 1 2
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 23128 KB Output is correct
2 Correct 6 ms 23132 KB Output is correct
3 Correct 7 ms 22960 KB Output is correct
4 Correct 6 ms 23132 KB Output is correct
5 Correct 5 ms 23132 KB Output is correct
6 Correct 5 ms 23128 KB Output is correct
7 Incorrect 6 ms 23132 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 79 ms 41128 KB Output is correct
2 Correct 76 ms 41772 KB Output is correct
3 Correct 99 ms 42576 KB Output is correct
4 Correct 116 ms 53096 KB Output is correct
5 Incorrect 522 ms 127084 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 23132 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 23156 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 23128 KB Output is correct
2 Correct 6 ms 23132 KB Output is correct
3 Correct 7 ms 22960 KB Output is correct
4 Correct 6 ms 23132 KB Output is correct
5 Correct 5 ms 23132 KB Output is correct
6 Correct 5 ms 23128 KB Output is correct
7 Incorrect 6 ms 23132 KB Output isn't correct
8 Halted 0 ms 0 KB -