Submission #765171

#TimeUsernameProblemLanguageResultExecution timeMemory
765171ono_de206Werewolf (IOI18_werewolf)C++14
100 / 100
466 ms89412 KiB
#include "werewolf.h"
#include<bits/stdc++.h>
using namespace std;

#define in insert
#define all(x) x.begin(),x.end()
#define pb push_back
#define eb emplace_back
#define ff first
#define ss second

template<typename T>
void mxx(T &a, T b){if(b > a) a = b;}
template<typename T>
void mnn(T &a, T b){if(b < a) a = b;}

const int mxn = 2e5 + 10;
int p[mxn], in[2][mxn], out[2][mxn], T;

int find(int x) {
	return p[x] == x ? x : p[x] = find(p[x]);
}

vector<vector<int>> adj[2], g;
vector<int> order[2];

void unite(int x, int y, int id) {
	x = find(x);
	y = find(y);
	if(x == y) return;
	p[y] = x;
	adj[id][x].pb(y);
}

void dfs(int to, int id) {
	in[id][to] = T++;
	order[id].pb(to);
	for(int x : adj[id][to]) {
		dfs(x, id);
	}
	out[id][to] = T - 1;
}

int d[mxn * 4];

void update(int l, int r, int i, int id, int x) {
	if(l == r) {
		d[i] = x;
		return;
	}
	int m = (l + r) / 2;
	if(id <= m) update(l, m, i * 2, id, x);
	else update(m + 1, r, i * 2 + 1, id, x);
	d[i] = min(d[i * 2], d[i * 2 + 1]);
}

int query(int l, int r, int i, int x, int y) {
	if(l >= x && r <= y) return d[i];
	int m = (l + r) / 2;
	if(y <= m) return query(l, m, i * 2, x, y);
	if(x > m) return query(m + 1, r, i * 2 + 1, x, y);
	return min(query(l, m, i * 2, x, y), query(m + 1, r, i * 2 + 1, x, y));
}

vector<int> check_validity(int n, vector<int> X, vector<int> Y, vector<int> S, vector<int> E, vector<int> L, vector<int> R) {
	int Q = E.size();
	vector<int> ret(Q);

	g = adj[0] = adj[1] = vector<vector<int>>(n);

	for(int i = 0; i < X.size(); i++) {
		g[X[i]].pb(Y[i]);
		g[Y[i]].pb(X[i]);
	}

	vector<int> pa(Q), pb(Q);
	vector<vector<int>> v;

	auto setDsu = [&]() -> void {
		v.clear();
		v.resize(n);
		for(int i = 0; i < n; i++) {
			p[i] = i;
		}
	};

	setDsu();
	{
		for(int i = 0; i < Q; i++) {
			v[L[i]].pb(i);
		}

		for(int i = n - 1; i >= 0; i--) {
			for(int x : g[i]) {
				if(x > i) {
					unite(i, x, 0);
				}
			}
			for(int id : v[i]) {
				pa[id] = find(S[id]);
			}
		}
	}

	setDsu();
	{
		for(int i = 0; i < Q; i++) {
			v[R[i]].pb(i);
		}

		for(int i = 0; i < n; i++) {
			for(int x : g[i]) {
				if(x < i) {
					unite(i, x, 1);
				}
			}
			for(int id : v[i]) {
				pb[id] = find(E[id]);
			}
		}
	}

	dfs(0, 0); T = 0;
	dfs(n - 1, 1); T = 0;

	vector<vector<pair<pair<int, int>, pair<int, int>>>> qu(n);
	for(int i = 0; i < Q; i++) {
		int l1 = in[0][pa[i]], r1 = out[0][pa[i]];
		int l2 = in[1][pb[i]], r2 = out[1][pb[i]];
		qu[l1].pb({{i, r1}, {l2, r2}});
	}

	for(int i = 0; i < n; i++) {
		update(0, n - 1, 1, in[1][order[0][i]], i);
	}

	for(int i = 0; i < n; i++) {
		for(auto it : qu[i]) {
			int r = it.ff.ss, L = it.ss.ff, R = it.ss.ss, id = it.ff.ff;
			int mn = query(0, n - 1, 1, L, R);
			if(mn <= r) ret[id] = 1;
			else ret[id] = 0;
		}
		update(0, n - 1, 1, in[1][order[0][i]], n + 10);
	}
	return ret;
}

Compilation message (stderr)

werewolf.cpp: In function 'std::vector<int> check_validity(int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
werewolf.cpp:71:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |  for(int i = 0; i < X.size(); i++) {
      |                 ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...