Submission #970866

# Submission time Handle Problem Language Result Execution time Memory
970866 2024-04-27T12:11:19 Z BestCrazyNoob Werewolf (IOI18_werewolf) C++17
100 / 100
619 ms 130260 KB
#include "werewolf.h"
#include <vector>
#include <utility>
#include <array>

using namespace std;
constexpr int INF = 1e9;
constexpr int H = 20;

struct DSU2 {
    // O(log(n))
    vector<int> r;
    DSU2(int n) {
        r.resize(n, -1);
    }
    int repr(int a) {
        return r[a] < 0 ? a : (r[a] = repr(r[a]));
    }
    // a will become the repr
    int join(int a, int b) {
        a = repr(a);
        b = repr(b);
        if (a == b) return -1;
        // use given order
        r[b] = a;
        return b; // after call to repr()
    }
};

struct SegTree {
    vector<int> tree;
    int sz;
    int ql, qr;
    SegTree() {}
    SegTree(int n) {
        sz = 1;
        while (sz < n) sz *= 2;
        tree.resize(2*sz, -1);
    }
    int __query(int ni, int nl, int nr) {
        if (qr <= nl || nr <= ql) return -1;
        if (ql <= nl && nr <= qr) return tree[ni];
        int nm = (nl+nr)/2;
        return max(__query(2*ni, nl, nm), __query(2*ni+1, nm, nr));
    }
    int query(int l, int r) {
        ql = l;
        qr = r;
        return __query(1, 0, sz);
    }
    void set(int i, int x) {
        i += sz;
        tree[i] = x;
        while (i > 1) {
            i /= 2;
            tree[i] = max(tree[2*i], tree[2*i+1]);
        }
    }
};

vector<vector<int>> graph, adj0, adj1;
vector<int> tin0, tin1, tout0, tout1, ans;
int N, M, curr_eul;
SegTree seg;
vector<array<int, H>> anc0, anc1;
// other, q_index
vector<vector<pair<int, int>>> queries;

void setup0() {
    DSU2 maxel(N);
    adj0.resize(N);
    for (int i = 0; i < N; ++i) {
        for (int x: graph[i]) {
            if (x > i) continue;
            const int other = maxel.join(i, x);
            if (other == -1) continue;
            adj0[i].push_back(other);
            adj0[other].push_back(i);
        }
    }
}

void setup1() {
    DSU2 maxel(N);
    adj1.resize(N);
    for (int i = N-1; i >= 0; --i) {
        for (int x: graph[i]) {
            if (x < i) continue;
            const int other = maxel.join(i, x);
            if (other == -1) continue;
            adj1[i].push_back(other);
            adj1[other].push_back(i);
        }
    }
}

void euler(int curr, int prev, vector<vector<int>> &adj, vector<int> &tin, vector<int> &tout, vector<array<int, H>> &anc) {
    tin[curr] = curr_eul++;
    for (int x: adj[curr]) {
        if (x == prev) continue;
        anc[x][0] = curr;
        euler(x, curr, adj, tin, tout, anc);
    }
    tout[curr] = curr_eul;
}

void calc_anc(vector<array<int, H>> &anc) {
    for (int h = 0; h < H-1; ++h) {
        for (auto &arr: anc) {
            arr[h+1] = arr[h] == -1 ? -1 : anc[arr[h]][h];
        }
    }
}

int get_anc0(int x, int d) {
    for (int h = H-1; h >= 0; --h) {
        if (anc0[x][h] != -1 && anc0[x][h] <= d) x = anc0[x][h];
    }
    return x;
}

int get_anc1(int x, int d) {
    for (int h = H-1; h >= 0; --h) {
        if (anc1[x][h] != -1 && anc1[x][h] >= d) x = anc1[x][h];
    }
    return x;
}

void answer(int curr, int prev) {
    for (int x: adj0[curr]) {
        if (x == prev) continue;
        answer(x, curr);
    }
    // mark the current node visited and say when it was visited
    seg.set(tin1[curr], tin0[curr]);
    for (auto [other, q_index]: queries[curr]) {
        ans[q_index] = seg.query(tin1[other], tout1[other]) >= tin0[curr];
    }
}

vector<int> check_validity(int N, vector<int> X, vector<int> Y, vector<int> S, vector<int> E, vector<int> L, vector<int> R) {
    const int Q = S.size();
    M = X.size();
    ::N = N;

    graph.resize(N);
    for (int m = 0; m < M; ++m) {
        graph[X[m]].push_back(Y[m]);
        graph[Y[m]].push_back(X[m]);
    }
    // trasform into tree
    setup0();
    setup1();

    anc0.resize(N);
    tin0.resize(N);
    tout0.resize(N);
    anc0[N-1][0] = -1;
    curr_eul = 0;
    euler(N-1, -1, adj0, tin0, tout0, anc0);
    calc_anc(anc0);

    anc1.resize(N);
    tin1.resize(N);
    tout1.resize(N);
    anc1[0][0] = -1;
    curr_eul = 0;
    euler(0, -1, adj1, tin1, tout1, anc1);
    calc_anc(anc1);
    
    ans.resize(Q);
    queries.resize(N);
    for (int q = 0; q < Q; ++q) {
        queries[get_anc0(E[q], R[q])].push_back({get_anc1(S[q], L[q]), q});
    }

    seg = SegTree(N);
    answer(N-1, -1);

    return ans;
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 428 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 428 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 5 ms 1880 KB Output is correct
11 Correct 5 ms 1876 KB Output is correct
12 Correct 4 ms 1716 KB Output is correct
13 Correct 5 ms 2404 KB Output is correct
14 Correct 5 ms 2140 KB Output is correct
15 Correct 5 ms 1884 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 562 ms 97348 KB Output is correct
2 Correct 476 ms 108068 KB Output is correct
3 Correct 422 ms 100160 KB Output is correct
4 Correct 423 ms 96864 KB Output is correct
5 Correct 432 ms 96928 KB Output is correct
6 Correct 463 ms 96940 KB Output is correct
7 Correct 493 ms 96396 KB Output is correct
8 Correct 449 ms 108008 KB Output is correct
9 Correct 354 ms 100408 KB Output is correct
10 Correct 373 ms 96460 KB Output is correct
11 Correct 362 ms 96576 KB Output is correct
12 Correct 374 ms 96356 KB Output is correct
13 Correct 552 ms 113016 KB Output is correct
14 Correct 536 ms 113060 KB Output is correct
15 Correct 532 ms 112960 KB Output is correct
16 Correct 536 ms 113636 KB Output is correct
17 Correct 478 ms 96580 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 428 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 5 ms 1880 KB Output is correct
11 Correct 5 ms 1876 KB Output is correct
12 Correct 4 ms 1716 KB Output is correct
13 Correct 5 ms 2404 KB Output is correct
14 Correct 5 ms 2140 KB Output is correct
15 Correct 5 ms 1884 KB Output is correct
16 Correct 562 ms 97348 KB Output is correct
17 Correct 476 ms 108068 KB Output is correct
18 Correct 422 ms 100160 KB Output is correct
19 Correct 423 ms 96864 KB Output is correct
20 Correct 432 ms 96928 KB Output is correct
21 Correct 463 ms 96940 KB Output is correct
22 Correct 493 ms 96396 KB Output is correct
23 Correct 449 ms 108008 KB Output is correct
24 Correct 354 ms 100408 KB Output is correct
25 Correct 373 ms 96460 KB Output is correct
26 Correct 362 ms 96576 KB Output is correct
27 Correct 374 ms 96356 KB Output is correct
28 Correct 552 ms 113016 KB Output is correct
29 Correct 536 ms 113060 KB Output is correct
30 Correct 532 ms 112960 KB Output is correct
31 Correct 536 ms 113636 KB Output is correct
32 Correct 478 ms 96580 KB Output is correct
33 Correct 547 ms 100608 KB Output is correct
34 Correct 213 ms 34848 KB Output is correct
35 Correct 567 ms 107404 KB Output is correct
36 Correct 573 ms 99228 KB Output is correct
37 Correct 619 ms 105672 KB Output is correct
38 Correct 561 ms 100932 KB Output is correct
39 Correct 504 ms 129092 KB Output is correct
40 Correct 589 ms 110584 KB Output is correct
41 Correct 456 ms 103172 KB Output is correct
42 Correct 426 ms 97988 KB Output is correct
43 Correct 571 ms 114496 KB Output is correct
44 Correct 481 ms 104768 KB Output is correct
45 Correct 459 ms 130260 KB Output is correct
46 Correct 495 ms 129656 KB Output is correct
47 Correct 536 ms 113180 KB Output is correct
48 Correct 584 ms 113028 KB Output is correct
49 Correct 551 ms 113232 KB Output is correct
50 Correct 547 ms 112964 KB Output is correct
51 Correct 581 ms 110976 KB Output is correct
52 Correct 539 ms 110980 KB Output is correct