답안 #766145

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
766145 2023-06-25T10:37:41 Z tengiz05 늑대인간 (IOI18_werewolf) C++17
100 / 100
1084 ms 477576 KB
#include "werewolf.h"
#include "iostream"
#include "array"
#include "queue"
#include "bitset"
#include "algorithm"
#ifndef EVAL
#include "grader.cpp"
#endif
using namespace std;
using i64 = long long;

constexpr int B = 200;
constexpr int NB = 200000 / B;

struct DSUmin {
    int n;
    vector<int> p;
    DSUmin(int n) : n(n), p(n) { for (int i = 0; i < n; i++) p[i] = i; }
    int leader(int u) {
        while (u != p[u]) u = p[u] = p[p[u]];
        return u;
    }
    void merge(int u, int v) {
        u = leader(u);
        v = leader(v);
        if (u == v) return;
        p[v] = u;
    }
};
struct DSUbit {
    int n;
    vector<int> p, siz;
    vector<bitset<NB>> f;
    DSUbit(int n) : n(n), p(n), siz(n, 1), f(n) { for (int i = 0; i < n; i++) p[i] = i; }
    int leader(int u) {
        while (u != p[u]) u = p[u] = p[p[u]];
        return u;
    }
    void merge(int u, int v) {
        u = leader(u);
        v = leader(v);
        if (u == v) return;
        if (siz[v] > siz[u]) swap(u, v);
        f[u] |= f[v];
        siz[u] += siz[v];
        p[v] = u;
    }
};

std::vector<int> Min;
std::vector<int> block;

struct DSU {
    int n;
    vector<int> p, siz;
    vector<vector<int>> f;
    vector<bitset<NB>> bf;
    DSU(int n) : n(n), p(n), siz(n), f(n), bf(n) {
        for (int i = 0; i < n; i++) {
            siz[i] = 1;
            p[i] = i;
            f[i].push_back(i);
        }
    }
    int leader(int u) {
        while (u != p[u]) u = p[u] = p[p[u]];
        return u;
    }
    void merge(int u, int v) {
        u = leader(u);
        v = leader(v);
        if (u == v) return;
        if (siz[v] > siz[u]) swap(u, v);
        for (int x : f[v]) {
            f[u].push_back(x);
        }
        f[v].clear();
        f[v].shrink_to_fit();
        siz[u] += siz[v];
        bf[u] |= bf[v];
        p[v] = u;
        if (f[u].size() >= B) {
            for (int i = 0; i < B; i++) {
                block[f[u].back()] = Min.size();
                f[u].pop_back();
            }
            bf[u][Min.size()] = 1;
            Min.push_back(n);
        }
    }
};

std::vector<int> check_validity(int n, std::vector<int> X, std::vector<int> Y,
                                std::vector<int> S, std::vector<int> E,
                                std::vector<int> L, std::vector<int> R) {
    int m = X.size();
    vector<vector<int>> e(n);
    for (int i = 0; i < m; i++) {
        e[X[i]].push_back(Y[i]);
        e[Y[i]].push_back(X[i]);
    }
    int Q = S.size();
    vector<int> ans(Q);
    vector<vector<array<int, 4>>> q(n);
    for (int i = 0; i < Q; i++) {
        q[R[i]].push_back({i, S[i], E[i], L[i]});
    }
    DSU dsu(n);
    block.assign(n, -1);
    vector<vector<array<int, 3>>> nq(n);
    vector<vector<tuple<int, int, bitset<NB>>>> bq(n);
    for (int i = 0; i < n; i++) {
        for (int j : e[i]) {
            if (j < i) {
                dsu.merge(i, j);
            }
        }
        for (auto [id, s, t, L] : q[i]) {
            for (int x : dsu.f[dsu.leader(t)]) {
                nq[L].push_back({id, s, x});
            }
            bq[L].push_back({id, s, dsu.bf[dsu.leader(t)]});
        }
    }
    DSUmin fastdsu(n);
    DSUbit bitdsu(n);
    for (int i = 0; i < n; i++) {
        if (block[i] != -1) {
            bitdsu.f[i][block[i]] = 1;
        }
    }
    for (int i = n - 1; i >= 0; i--) {
        for (int j : e[i]) {
            if (j > i) {
                fastdsu.merge(i, j);
                bitdsu.merge(i, j);
            }
        }
        for (auto [id, s, x] : nq[i]) {
            if (fastdsu.leader(x) == fastdsu.leader(s)) {
                ans[id] = 1;
            }
        }
        for (auto [id, s, x] : bq[i]) {
            if ((bitdsu.f[bitdsu.leader(s)] & x).count()) {
                ans[id] = 1;
            }
        }
    }
    return ans;
}

/*


6 6 3
5 1
1 2
1 3
3 4
3 0
5 2
4 2 1 2
4 2 2 2
5 4 3 4



*/
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 468 KB Output is correct
2 Correct 1 ms 424 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 428 KB Output is correct
6 Correct 1 ms 428 KB Output is correct
7 Correct 1 ms 468 KB Output is correct
8 Correct 1 ms 300 KB Output is correct
9 Correct 1 ms 468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 468 KB Output is correct
2 Correct 1 ms 424 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 428 KB Output is correct
6 Correct 1 ms 428 KB Output is correct
7 Correct 1 ms 468 KB Output is correct
8 Correct 1 ms 300 KB Output is correct
9 Correct 1 ms 468 KB Output is correct
10 Correct 9 ms 5972 KB Output is correct
11 Correct 8 ms 5588 KB Output is correct
12 Correct 6 ms 3668 KB Output is correct
13 Correct 10 ms 7764 KB Output is correct
14 Correct 10 ms 7736 KB Output is correct
15 Correct 12 ms 7660 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 610 ms 220208 KB Output is correct
2 Correct 922 ms 469876 KB Output is correct
3 Correct 894 ms 469712 KB Output is correct
4 Correct 849 ms 454840 KB Output is correct
5 Correct 884 ms 445460 KB Output is correct
6 Correct 897 ms 371632 KB Output is correct
7 Correct 701 ms 277932 KB Output is correct
8 Correct 880 ms 470380 KB Output is correct
9 Correct 679 ms 389556 KB Output is correct
10 Correct 795 ms 416320 KB Output is correct
11 Correct 592 ms 269392 KB Output is correct
12 Correct 750 ms 375460 KB Output is correct
13 Correct 860 ms 469448 KB Output is correct
14 Correct 887 ms 469872 KB Output is correct
15 Correct 869 ms 470528 KB Output is correct
16 Correct 888 ms 468812 KB Output is correct
17 Correct 702 ms 325164 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 468 KB Output is correct
2 Correct 1 ms 424 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 428 KB Output is correct
6 Correct 1 ms 428 KB Output is correct
7 Correct 1 ms 468 KB Output is correct
8 Correct 1 ms 300 KB Output is correct
9 Correct 1 ms 468 KB Output is correct
10 Correct 9 ms 5972 KB Output is correct
11 Correct 8 ms 5588 KB Output is correct
12 Correct 6 ms 3668 KB Output is correct
13 Correct 10 ms 7764 KB Output is correct
14 Correct 10 ms 7736 KB Output is correct
15 Correct 12 ms 7660 KB Output is correct
16 Correct 610 ms 220208 KB Output is correct
17 Correct 922 ms 469876 KB Output is correct
18 Correct 894 ms 469712 KB Output is correct
19 Correct 849 ms 454840 KB Output is correct
20 Correct 884 ms 445460 KB Output is correct
21 Correct 897 ms 371632 KB Output is correct
22 Correct 701 ms 277932 KB Output is correct
23 Correct 880 ms 470380 KB Output is correct
24 Correct 679 ms 389556 KB Output is correct
25 Correct 795 ms 416320 KB Output is correct
26 Correct 592 ms 269392 KB Output is correct
27 Correct 750 ms 375460 KB Output is correct
28 Correct 860 ms 469448 KB Output is correct
29 Correct 887 ms 469872 KB Output is correct
30 Correct 869 ms 470528 KB Output is correct
31 Correct 888 ms 468812 KB Output is correct
32 Correct 702 ms 325164 KB Output is correct
33 Correct 769 ms 320508 KB Output is correct
34 Correct 531 ms 336836 KB Output is correct
35 Correct 859 ms 370236 KB Output is correct
36 Correct 665 ms 263996 KB Output is correct
37 Correct 816 ms 353024 KB Output is correct
38 Correct 695 ms 290776 KB Output is correct
39 Correct 914 ms 477100 KB Output is correct
40 Correct 1084 ms 459464 KB Output is correct
41 Correct 812 ms 319836 KB Output is correct
42 Correct 498 ms 181236 KB Output is correct
43 Correct 952 ms 446872 KB Output is correct
44 Correct 803 ms 351572 KB Output is correct
45 Correct 797 ms 418476 KB Output is correct
46 Correct 719 ms 430884 KB Output is correct
47 Correct 871 ms 477576 KB Output is correct
48 Correct 857 ms 476132 KB Output is correct
49 Correct 877 ms 475740 KB Output is correct
50 Correct 911 ms 474992 KB Output is correct
51 Correct 736 ms 383748 KB Output is correct
52 Correct 829 ms 401148 KB Output is correct