Submission #293305

#TimeUsernameProblemLanguageResultExecution timeMemory
293305Atill83Werewolf (IOI18_werewolf)C++14
0 / 100
760 ms68540 KiB
#include "werewolf.h" #include <bits/stdc++.h> using namespace std; typedef vector<int> vi; const int MAXN = (int) 5e5 + 5; int n; int t[MAXN]; void upd(int v, int val){ v++; for(; v < MAXN; v += (v&-v)) t[v] += val; } int gt(int l, int r){ r++; int res = 0; for(; r; r -= (r&-r)) res += t[r]; for(; l; l -= (l&-l)) res -= t[l]; return res; } vector<pair<int, int>> Qs[MAXN]; vector<int> A; struct ali{ int cev[MAXN], tin[MAXN], tout[MAXN], sz[MAXN]; int cur = 1; int par[MAXN]; vector<int> adj[MAXN]; void ini(){ for(int i = 0; i < n; i++){ adj[i].clear(); sz[i] = 1; par[i] = i; } } int find_set(int v){ if(par[v] == v) return v; return par[v] = find_set(par[v]); } void merge(int a, int b, bool cur){ a = find_set(a); b = find_set(b); if(a == b) return; if(cur){ if(a < b){ swap(a, b); } sz[a] += sz[b]; par[b] = a; adj[a].push_back(b); }else{ if(a > b) swap(a, b); sz[a] += sz[b]; par[b] = a; adj[a].push_back(b); } } void dfs(int v){ tin[v] = cur++; cev[cur - 1] = v; for(int j: adj[v]) dfs(j); tout[v] = cur - 1; } void dfs2(int v, bool keep, ali &s){ int hv = -1; for(int j: adj[v]){ if(hv == -1 || sz[j] > sz[hv]) hv = j; } for(int j: adj[v]){ if(j != hv) dfs2(j, 0, s); } if(hv != -1) dfs2(hv, 1, s); for(int j: adj[v]){ if(j != hv){ for(int i = tin[j]; i <= tout[j]; i++){ upd(s.tin[cev[i]], 1); } } } upd(s.tin[v], 1); for(auto j: Qs[v]){ int rs = gt(s.tin[j.first], s.tout[j.first]); assert(rs >= 0); A[j.second] = (rs > 0); } if(keep == 0) for(int i = tin[v]; i <= tout[v]; i++) upd(s.tin[cev[i]], -1); } } st1, st2; vi check_validity(int N, vi X, vi Y, vi S, vi E, vi L, vi R) { n = N; int M = X.size(), Q = S.size(); st1.ini(); st2.ini(); A.resize(Q); vector<int> esi; for(int i = 0; i < M; i++){ esi.push_back(i); } sort(esi.begin(), esi.end(), [&X, &Y](int a, int b){ if(min(X[a], Y[a]) == min(X[b], Y[b])){ return max(X[a], Y[a]) < max(X[b], Y[b]); } return min(X[a], Y[a]) > min(X[b], Y[b]); }); st1.ini(); st2.ini(); for(int i = 0; i < M; i++){ st1.merge(X[esi[i]], Y[esi[i]], 0); } sort(esi.begin(), esi.end(), [&X, &Y](int a, int b){ if(max(X[a], Y[a]) == max(X[b], Y[b])) return min(X[a], Y[a]) > min(X[b], Y[b]); return max(X[a], Y[a]) < max(X[b], Y[b]); }); for(int i = 0; i < M; i++){ st2.merge(X[esi[i]], Y[esi[i]], 1); } st1.dfs(0); st2.dfs(n - 1); for(int i = 0; i < Q; i++){ if(st1.tin[S[i]] < st1.tin[L[i]] || st1.tin[S[i]] > st1.tout[L[i]]){ L[i] = S[i]; } if(st2.tin[E[i]] < st2.tin[R[i]] || st2.tin[E[i]] > st2.tout[R[i]]){ R[i] = E[i]; } Qs[L[i]].push_back({R[i], i}); } st1.dfs2(0, 0, st2); return A; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...