Submission #777137

# Submission time Handle Problem Language Result Execution time Memory
777137 2023-07-08T17:39:39 Z GusterGoose27 Werewolf (IOI18_werewolf) C++17
15 / 100
1933 ms 522728 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;

stree *inv[MAXN];

class stree {
public:
    int lp, rp;
    stree *par;
    stree *l = nullptr;
    stree *r = nullptr;
    int id;
    stree(int lv, int rv, stree *p = nullptr) {
        lp = lv;
        rp = rv;
        par = p;
        if (lp < rp) {
            int mid = (lp+rp)/2;
            l = new stree(lp, mid, this);
            r = new stree(mid+1, rp, this);
            id = t++;
        }
        else {
            id = order[lp];
            inv[order[lp]] = this;
        }
    }
    void decompose(int lv, int rv, vector<int> &v) {
        if (lp > rv || rp < lv) return;
        if (lp >= lv && rp <= rv) {
            v.push_back(id);
            return;
        }
        l->decompose(lv, rv, v);
        r->decompose(lv, rv, v);
    }
};

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;
}

set<int> cont[MAXN];

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);
    tree = new stree(0, n-1);
    for (int i = 0; i < q; i++) {
        tree->decompose(range[tree_node[i]].first, range[tree_node[i]].second, query_nodes[i]);
    }
    iota(uf, uf+n, 0);
    for (int i = 0; i < n; i++) {
        for (stree *cur = inv[i]; cur != nullptr; cur = cur->par) {
            cont[i].insert(cur->id);
        }
        assert(cont[i].find(i) != cont[i].end());
    }
    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;
}
# Verdict Execution time Memory Grader output
1 Correct 14 ms 33236 KB Output is correct
2 Correct 14 ms 33280 KB Output is correct
3 Correct 15 ms 33232 KB Output is correct
4 Correct 15 ms 33108 KB Output is correct
5 Correct 14 ms 33236 KB Output is correct
6 Correct 14 ms 33168 KB Output is correct
7 Correct 14 ms 33236 KB Output is correct
8 Correct 15 ms 33208 KB Output is correct
9 Correct 15 ms 33236 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 14 ms 33236 KB Output is correct
2 Correct 14 ms 33280 KB Output is correct
3 Correct 15 ms 33232 KB Output is correct
4 Correct 15 ms 33108 KB Output is correct
5 Correct 14 ms 33236 KB Output is correct
6 Correct 14 ms 33168 KB Output is correct
7 Correct 14 ms 33236 KB Output is correct
8 Correct 15 ms 33208 KB Output is correct
9 Correct 15 ms 33236 KB Output is correct
10 Correct 25 ms 35960 KB Output is correct
11 Correct 25 ms 35960 KB Output is correct
12 Correct 24 ms 35796 KB Output is correct
13 Correct 28 ms 36072 KB Output is correct
14 Correct 35 ms 36052 KB Output is correct
15 Correct 25 ms 35928 KB Output is correct
# Verdict Execution time Memory Grader output
1 Runtime error 1933 ms 522728 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 14 ms 33236 KB Output is correct
2 Correct 14 ms 33280 KB Output is correct
3 Correct 15 ms 33232 KB Output is correct
4 Correct 15 ms 33108 KB Output is correct
5 Correct 14 ms 33236 KB Output is correct
6 Correct 14 ms 33168 KB Output is correct
7 Correct 14 ms 33236 KB Output is correct
8 Correct 15 ms 33208 KB Output is correct
9 Correct 15 ms 33236 KB Output is correct
10 Correct 25 ms 35960 KB Output is correct
11 Correct 25 ms 35960 KB Output is correct
12 Correct 24 ms 35796 KB Output is correct
13 Correct 28 ms 36072 KB Output is correct
14 Correct 35 ms 36052 KB Output is correct
15 Correct 25 ms 35928 KB Output is correct
16 Runtime error 1933 ms 522728 KB Execution killed with signal 11
17 Halted 0 ms 0 KB -