답안 #777158

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
777158 2023-07-08T18:07:27 Z GusterGoose27 늑대인간 (IOI18_werewolf) C++17
15 / 100
1885 ms 473308 KB
#include "werewolf.h"

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 2e5+5;

typedef pair<int, int> pii;

int n, m, q;
vector<int> edges[MAXN];
vector<int> dsutree[MAXN];
int uf[MAXN];
int order[MAXN];
pii range[MAXN];
vector<int> query_nodes[MAXN];
vector<int> uf2;
vector<int> lquery[MAXN];
vector<int> rquery[MAXN];
int tree_node[MAXN];
int t = 0;

int find(int i) {
    return uf[i] == i ? i : uf[i] = find(uf[i]);
}

void merge(int i, int j) {
    j = find(j);
    if (i == j) return;
    assert(i > j);
    uf[j] = i;
    dsutree[i].push_back(j);
}

class stree;

unordered_set<int> cont[MAXN];
int id[2*MAXN];

void make_decomp() {
    for (int i = n; i < 2*n; i++) id[i] = order[i-n];
    for (int i = 1; i < n; i++) {
        id[i] = t++;
    }
    for (int i = n; i < 2*n; i++) {
        for (int cur = i; cur > 0; cur /= 2) {
            cont[order[i-n]].insert(id[cur]);
        }
        // cerr << order[i-n] << ": \n";
        // for (int v: cont[order[i-n]]) cerr << v << ' ';
        // cerr << '\n';
    }
    for (int i = 0; i < q; i++) {
        for (int l = range[tree_node[i]].first+n, r = range[tree_node[i]].second+1+n; r > l; l /= 2, r /= 2) {
            if (l & 1) query_nodes[i].push_back(id[l++]);
            if (r & 1) query_nodes[i].push_back(id[--r]);
        }
    }
}

stree *tree;

void dfs(int cur) {
    range[cur].first = t;
    order[t++] = cur;
    for (int nxt: dsutree[cur]) dfs(nxt);
    range[cur].second = t-1;
}

vector<int> check_validity(int N, vector<int> X, vector<int> Y,vector<int> S, vector<int> E,vector<int> L, vector<int> R) {
    q = S.size();
    n = N;
    m = X.size();
    for (int i = 0; i < q; i++) {
        lquery[L[i]].push_back(i);
        rquery[R[i]].push_back(i);
    }
    for (int i = 0; i < m; i++) {
        edges[X[i]].push_back(Y[i]);
        edges[Y[i]].push_back(X[i]);
    }
    iota(uf, uf+n, 0);
    for (int i = 0; i < n; i++) {
        for (int nxt: edges[i]) {
            if (nxt > i) continue;
            merge(i, nxt);
        }
        for (int v: rquery[i]) tree_node[v] = find(E[v]);
    }
    dfs(n-1);
    // assert(false);
    // tree = new stree(); // really thick
    // // assert(false);
    // for (int i = 0; i < q; i++) {
    //     tree->decompose(range[tree_node[i]].first, range[tree_node[i]].second, query_nodes[i]);
    //     assert(query_nodes[i].size() < 40);
    // }
    make_decomp();
    // assert(false);
    iota(uf, uf+n, 0);
    for (int i = 0; i < n; i++) {
        // assert(cont[i].find(i) != cont[i].end());
        // assert(cont[i].size() < 20);
    }
    vector<int> ans(q, 0);
    for (int i = n-1; i >= 0; i--) {
        for (int nxt: edges[i]) {
            if (nxt < i) continue;
            int v = uf[nxt];
            int u = uf[i];
            if (u == v) continue;
            if (cont[u].size() < cont[v].size()) swap(u, v);
            for (int val: cont[v]) {
                cont[u].insert(val);
                uf[val] = u;
            }
            cont[v].clear();
        }
        for (int v: lquery[i]) {
            for (int check: query_nodes[v]) {
                if (cont[uf[S[v]]].find(check) != cont[uf[S[v]]].end()) {
                    ans[v] = 1;
                    break;
                }
            }
        }
    }
    return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 34772 KB Output is correct
2 Correct 18 ms 34788 KB Output is correct
3 Correct 17 ms 34800 KB Output is correct
4 Correct 21 ms 34772 KB Output is correct
5 Correct 18 ms 34836 KB Output is correct
6 Correct 18 ms 34772 KB Output is correct
7 Correct 17 ms 34748 KB Output is correct
8 Correct 18 ms 34784 KB Output is correct
9 Correct 18 ms 34840 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 34772 KB Output is correct
2 Correct 18 ms 34788 KB Output is correct
3 Correct 17 ms 34800 KB Output is correct
4 Correct 21 ms 34772 KB Output is correct
5 Correct 18 ms 34836 KB Output is correct
6 Correct 18 ms 34772 KB Output is correct
7 Correct 17 ms 34748 KB Output is correct
8 Correct 18 ms 34784 KB Output is correct
9 Correct 18 ms 34840 KB Output is correct
10 Correct 25 ms 37204 KB Output is correct
11 Correct 24 ms 37224 KB Output is correct
12 Correct 25 ms 37332 KB Output is correct
13 Correct 27 ms 37696 KB Output is correct
14 Correct 29 ms 38088 KB Output is correct
15 Correct 26 ms 37368 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1885 ms 473308 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 34772 KB Output is correct
2 Correct 18 ms 34788 KB Output is correct
3 Correct 17 ms 34800 KB Output is correct
4 Correct 21 ms 34772 KB Output is correct
5 Correct 18 ms 34836 KB Output is correct
6 Correct 18 ms 34772 KB Output is correct
7 Correct 17 ms 34748 KB Output is correct
8 Correct 18 ms 34784 KB Output is correct
9 Correct 18 ms 34840 KB Output is correct
10 Correct 25 ms 37204 KB Output is correct
11 Correct 24 ms 37224 KB Output is correct
12 Correct 25 ms 37332 KB Output is correct
13 Correct 27 ms 37696 KB Output is correct
14 Correct 29 ms 38088 KB Output is correct
15 Correct 26 ms 37368 KB Output is correct
16 Runtime error 1885 ms 473308 KB Execution killed with signal 11
17 Halted 0 ms 0 KB -