제출 #1330699

#제출 시각아이디문제언어결과실행 시간메모리
1330699AMnu늑대인간 (IOI18_werewolf)C++20
100 / 100
331 ms100096 KiB
#include "werewolf.h"
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef pair<int,int> pii;
typedef pair<int,pii> piii;

const int MAXN = 2e5+5, LOG = 18;

int N, M, Q, T, ord[MAXN], fen[MAXN];
int dsu[MAXN], st[2][MAXN], en[2][MAXN], anc[2][MAXN][LOG];
vector <int> adj[MAXN], ch[2][MAXN], ans;
vector <piii> que[MAXN];

void update(int x) {
	for (int i=x;i<=N;i+=i&-i) {
		fen[i]++;
	}
}

int query(int x) {
	int ret = 0;
	for (int i=x;i;i-=i&-i) {
		ret += fen[i];
	}
	return ret;
}

int find(int x) {
	if (dsu[x] == x) return x;
	return dsu[x] = find(dsu[x]);
}

void dfs(int t,int x,int p) {
	anc[t][x][0] = p;
	for (int i=1;i<LOG;i++) {
		anc[t][x][i] = anc[t][anc[t][x][i-1]][i-1];
	}
	T++;
	ord[T] = x;
	st[t][x] = T;
	for (int y : ch[t][x]) {
		dfs(t,y,x);
	}
	en[t][x] = T;
}

vector<int> check_validity(int n,vector<int>X,vector<int>Y,
	vector<int>S,vector<int>E,vector<int>L,vector<int>R) {
	N = n;
	M = X.size();
	Q = S.size();
	for (int i=0;i<M;i++) {
		adj[X[i]].push_back(Y[i]);
		adj[Y[i]].push_back(X[i]);
	}
	for (int i=0;i<N;i++) {
		dsu[i] = i;
		for (int j : adj[i]) {
			if (j > i) continue;
			j = find(j);
			if (i != j) {
				ch[0][i].push_back(j);
				dsu[j] = i;
			}
		}
	}
	for (int i=N-1;i>=0;i--) {
		dsu[i] = i;
		for (int j : adj[i]) {
			if (j < i) continue;
			j = find(j);
			if (i != j) {
				ch[1][i].push_back(j);
				dsu[j] = i;
			}
		}
	}
	dfs(0,N-1,N-1);
	T = 0;
	dfs(1,0,0);
	for (int i=0;i<Q;i++) {
		int x = S[i];
		for (int j=LOG-1;j>=0;j--) {
			if (anc[1][x][j] >= L[i]) {
				x = anc[1][x][j];
			}
		}
		int y = E[i];
		for (int j=LOG-1;j>=0;j--) {
			if (anc[0][y][j] <= R[i]) {
				y = anc[0][y][j];
			}
		}
		que[st[1][x]-1].push_back({i,{st[0][y]-1,en[0][y]}});
		que[en[1][x]].push_back({i,{st[0][y]-1,en[0][y]}});
		ans.push_back(0);
	}
	for (int i=1;i<=N;i++) {
		update(st[0][ord[i]]);
		for (auto x : que[i]) {
			ans[x.fi] ^= query(x.se.se) - query(x.se.fi);
		}
	}
	for (int i=0;i<Q;i++) {
		ans[i] = !!ans[i];
	}
	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...