제출 #1077838

#제출 시각아이디문제언어결과실행 시간메모리
1077838vjudge1늑대인간 (IOI18_werewolf)C++17
15 / 100
4051 ms131140 KiB
#include "werewolf.h" #include <bits/stdc++.h> #pragma GCC optimize("O3") #pragma GCC target("avx,avx2") using namespace std; using vi = vector<int>; using ii = pair<int, int>; constexpr int BUCKET = 200; using bm = bitset<BUCKET>; struct DSU { vi e, mi, ma; DSU(int n) : e(n, -1), mi(n), ma(n) { iota(mi.begin(), mi.end(), 0); iota(ma.begin(), ma.end(), 0); } int repr(int u) { while(e[u] >= 0) u = e[u]; return u; } bool join(int u, int v) { u = repr(u); v = repr(v); if(u == v) return false; if(e[u] >= e[v]) swap(u, v); mi[u] = min(mi[u], mi[v]); ma[u] = max(ma[u], ma[v]); e[u] += e[v]; e[v] = u; return true; } bool same(int u, int v) { return repr(u) == repr(v); } ii seg(int u) { u = repr(u); return make_pair(mi[u], ma[u]); } }; struct treeE { int n; vi sz, par; vector<vi> G; vector<set<int> > Tmp; treeE(int N, vector<vi> &G0) : n(N), sz(N, 1), par(N, -1), G(G0), Tmp(N) { for(int i = 0; i < n; ++i) { for(auto it : G[i]) par[it] = i; } } void activate(int u, int id) { Tmp[u].insert(id); } void disable(int u, int id) { Tmp[u].erase(id); } ii find_active(int u) { /// {nod, id} while(u != -1) { if(!Tmp[u].empty()) { return {u, *Tmp[u].begin()}; } u = par[u]; } return {-1, -1}; } }; struct treeS { int n; vector<vi> G; treeS(int N, vector<vi> &G0) : n(N), G(G0) {} vi solve(treeE &TE, vi S, vi E) { int q = (int)S.size(); vi Re(q, 0); set<int> Active; vector<vi> MarkS(n); for(int i = 0; i < q; ++i) { MarkS[S[i]].push_back(i); } function<void(int)> dfs = [&](int u) { for(auto it : MarkS[u]) { Active.insert(it); TE.activate(E[it], it); } //fac verificarea de valoare int nod, id; while(1) { tie(nod, id) = TE.find_active(u); /// aka, valoarea u if(nod == -1) break; else { Active.erase(id); TE.disable(E[id], id); Re[id] = 1; } } for(auto it : G[u]) { dfs(it); } for(auto it : MarkS[u]) { if(Active.count(it)) { Active.erase(it); TE.disable(E[it], it); } } }; dfs(0); return Re; } }; struct BinLift { int n; vector<vi> A; BinLift(vi V) { n = int(V.size()); A.push_back(V); for(int k = 1; (1 << k) <= n; ++k) { A.push_back(A.back()); for(int i = 0; i < n; ++i) if(A[k - 1][i] < 0 || A[k - 1][i] >= n); else A[k][i] = A[k - 1][A[k - 1][i]]; } } int lift(int u, int k) { return A[k][u]; } }; vi check_validity(int n, vi X, vi Y, vi S, vi E, vi L, vi R) { int q = (int)S.size(), m = (int)X.size(); vector<vi> Lg(n); for(int i = 0; i < m; ++i) { Lg[X[i]].push_back(Y[i]); Lg[Y[i]].push_back(X[i]); } DSU St(n); vi GEpar(n, n), GSpar(n, -1); vector<vi> GE(n), GS(n); for(int i = 0; i < n; ++i) { for(auto it : Lg[i]) if(it < i) { auto [mi, ma] = St.seg(it); if(St.join(it, i)) { GE[i].push_back(ma); GEpar[ma] = i; } } } DSU Dr(n); for(int i = n - 1; i >= 0; --i) { for(auto it : Lg[i]) { if(it > i) { auto [mi, ma] = Dr.seg(it); if(Dr.join(it, i)) { GS[i].push_back(mi); GSpar[mi] = i; } } } } vector<vi> G(n); for(int i = 0; i < n; ++i) { copy(GS[i].begin(), GS[i].end(), back_inserter(G[i])); for(auto it : GE[i]) G[it].push_back(i); } BinLift BLS(GSpar), BLE(GEpar); auto reprS = [&](int u, int lim) { for(int k = int(BLS.A.size()) - 1; k >= 0; --k) if(BLS.lift(u, k) >= lim) u = BLS.lift(u, k); return u; }; auto reprE = [&](int u, int lim) { for(int k = int(BLE.A.size()) - 1; k >= 0; --k) if(BLE.lift(u, k) <= lim) u = BLE.lift(u, k); return u; }; for(int nr = 0; nr < q; ++nr) { S[nr] = reprS(S[nr], L[nr]); E[nr] = reprE(E[nr], R[nr]); } treeS TGS(n, GS); treeE TGE(n, GE); return TGS.solve(TGE, S, E); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...