제출 #766145

#제출 시각아이디문제언어결과실행 시간메모리
766145tengiz05늑대인간 (IOI18_werewolf)C++17
100 / 100
1084 ms477576 KiB
#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 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...