제출 #792755

#제출 시각아이디문제언어결과실행 시간메모리
792755NothingXD늑대인간 (IOI18_werewolf)C++17
100 / 100
684 ms100212 KiB
#include "werewolf.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef double ld; typedef complex<ld> point; void debug_out(){cerr << endl;} template<typename Head, typename... Tail> void debug_out(Head H, Tail... T){ cerr << H << ' '; debug_out(T...); } #define debug(...) cerr << "(" << #__VA_ARGS__ << "): ", debug_out(__VA_ARGS__) #define F first #define S second #define all(x) x.begin(), x.end() #define MP(x, y) make_pair(x, y) const int maxn = 2e5 + 10; const int lg = 20; int n, m, q, st[maxn], en[maxn], ver[maxn], tme, dsu[maxn], par[maxn][lg], comp[maxn]; vector<int> g[maxn], t[maxn]; set<int> val[maxn]; struct Query{ int l, s, e, idx; }; vector<Query> Q[maxn]; int getdsu(int v){ return (dsu[v] == -1? v: dsu[v] = getdsu(dsu[v])); } void merge(int u, int v){ if ((u = getdsu(u)) == (v = getdsu(v))) return; if (u < v) swap(u, v); dsu[u] = v; t[v].push_back(u); //debug(v, u); } void dfs(int v, int p = -1){ st[v] = ++tme; ver[tme] = v; par[v][0] = p; for (int i = 1; i < lg; i++){ if (par[v][i-1] != -1) par[v][i] = par[par[v][i-1]][i-1]; } for (auto u: t[v]){ dfs(u, v); } en[v] = tme; //debug(v, st[v], en[v]); //for (int i = 0; i < lg; i++) debug(i, par[v][i]); } void merge2(int u, int v){ if ((u = comp[u]) == (v = comp[v])) return; //debug(u, v); if (val[u].size() > val[v].size()) swap(u, v); for (auto x: val[u]){ if (ver[x] == u) continue; val[v].insert(x); comp[ver[x]] = v; } val[u].clear(); comp[u] = comp[v]; val[v].insert(st[u]); } vector<int> check_validity(int N, vector<int> X, vector<int> Y, vector<int> S, vector<int> E, vector<int> L, vector<int> R){ memset(dsu, -1, sizeof dsu); memset(par, -1, sizeof par); n = N; m = X.size(); q = S.size(); for (int i = 0; i < m; i++){ // debug(X[i], Y[i]); g[X[i]].push_back(Y[i]); g[Y[i]].push_back(X[i]); } for (int i = 0; i < q; i++){ // debug(L[i], R[i], S[i], E[i]); Q[R[i]].push_back({L[i], S[i], E[i], i}); } for (int i = n-1; ~i; i--){ for (auto u: g[i]){ if (u > i) merge(u, i); } } dfs(0); vector<int> ans(q); for (int i = 0; i < n; i++){ //debug(i, st[i]); comp[i] = i; val[i].insert(st[i]); for (auto u: g[i]){ if (u < i) merge2(u, i); } for (auto x : Q[i]){ // debug(x.l, x.s, x.e, x.idx); int v = x.s; for (int j = lg-1; ~j; j--){ if (par[v][j] >= x.l) v = par[v][j]; } // debug(v, st[v], en[v]); // debug(comp[x.e]); auto it = val[comp[x.e]].lower_bound(st[v]); if (it != val[comp[x.e]].end() && (*it) <= en[v]){ ans[x.idx] = 1; //debug((*it)); } else ans[x.idx] = 0; } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...