제출 #78781

#제출 시각아이디문제언어결과실행 시간메모리
78781wleung_bvg늑대인간 (IOI18_werewolf)C++14
100 / 100
1392 ms297016 KiB
#include "werewolf.h" #include <bits/stdc++.h> using namespace std; #define pb push_back #define eb emplace_back #define mp make_pair #define f first #define s second #define all(a) (a).begin(),(a).end() #define For(i,a,b) for(auto i=(a);i<(b);i++) #define FOR(i,b) For(i,0,b) #define Rev(i,a,b) for(auto i=(a);i>(b);i--) #define REV(i,a) Rev(i,a,-1) #define FORE(i,a) for(auto&&i:a) #define sz(a) (int((a).size())) using ll=long long;using ld=long double;using uint=unsigned int;using ull=unsigned long long; using pii=pair<int,int>;using pll=pair<ll,ll>;using pill=pair<int,ll>;using plli=pair<ll,int>;using pdd=pair<double,double>;using pld=pair<ld,ld>; constexpr const char nl='\n',sp=' ';constexpr const int INT_INF=0x3f3f3f3f;constexpr const ll LL_INF=0x3f3f3f3f3f3f3f3f; constexpr const double D_INF=numeric_limits<double>::infinity();constexpr const ld LD_INF=numeric_limits<ld>::infinity();constexpr const double EPS=1e-9; const int MAXN = 2e5 + 5, MAXQ = 2e5 + 5, MAXLGN = 20; int UF[2][MAXN], PAR[2][MAXLGN][MAXN], PRE[2][MAXN], POST[2][MAXN], VERT[2][MAXN], BIT[MAXN], ANS[MAXQ], cur; vector<int> ADJ[MAXN], TR[2][MAXN]; vector<pii> ADD[MAXN], SUB[MAXN]; int find(int i, int v) { return UF[i][v] < 0 ? v : UF[i][v] = find(i, UF[i][v]); } void join(int i, int v, int w) { v = find(i, v); w = find(i, w); if (v == w) return; UF[i][w] = v; TR[i][v].pb(w); PAR[i][0][w] = v; } void dfs(int i, int v) { VERT[i][PRE[i][v] = ++cur] = v; FORE(w, TR[i][v]) dfs(i, w); POST[i][v] = cur; } void update(int i, int v) { for (; i < MAXN; i += i & -i) BIT[i] += v; } int rsq(int i) { int ret = 0; for (; i > 0; i -= i & -i) ret += BIT[i]; return ret; } int rsq(int a, int b) { return rsq(b) - rsq(a - 1); } vector<int> check_validity(int N, vector<int> X, vector<int> Y, vector<int> S, vector<int> E, vector<int> L, vector<int> R) { FOR(i, sz(X)) { ADJ[X[i]].pb(Y[i]); ADJ[Y[i]].pb(X[i]); } FOR(i, 2) fill(UF[i], UF[i] + MAXN, -1); PAR[0][0][0] = 0; REV(i, N - 1) FORE(j, ADJ[i]) if (i < j) join(0, i, j); PAR[1][0][N - 1] = N - 1; FOR(i, N) FORE(j, ADJ[i]) if (i > j) join(1, i, j); cur = 0; dfs(0, 0); cur = 0; dfs(1, N - 1); FOR(i, 2) For(j, 1, MAXLGN) FOR(k, N) PAR[i][j][k] = PAR[i][j - 1][PAR[i][j - 1][k]]; FOR(i, sz(S)) { int s = S[i], e = E[i]; REV(j, MAXLGN - 1) { if (PAR[0][j][s] >= L[i]) s = PAR[0][j][s]; if (PAR[1][j][e] <= R[i]) e = PAR[1][j][e]; } ADD[POST[1][e]].eb(s, i); SUB[PRE[1][e] - 1].eb(s, i); } fill(BIT, BIT + MAXN, 0); fill(ANS, ANS + MAXQ, 0); For(i, 1, N + 1) { update(PRE[0][VERT[1][i]], 1); FORE(q, ADD[i]) ANS[q.s] += rsq(PRE[0][q.f], POST[0][q.f]); FORE(q, SUB[i]) ANS[q.s] -= rsq(PRE[0][q.f], POST[0][q.f]); } vector<int> ret; FOR(i, sz(S)) ret.pb(ANS[i] > 0); return ret; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...