Submission #308973

#TimeUsernameProblemLanguageResultExecution timeMemory
308973nafis_shifatWerewolf (IOI18_werewolf)C++14
100 / 100
784 ms83920 KiB
#include "werewolf.h"
#include <bits/stdc++.h>
#define pii pair<int,int>
#define f first
#define s second
using namespace std;
const int mxn = 2e5 + 2;
struct reachability_tree {
	int parent[mxn];
	int sz[mxn];
	int in[mxn],out[mxn],id[mxn];
	int pc[mxn];
	vector<int> g[mxn];
	vector<int> w[mxn];
	int T=0;

	void init(int n) {
		for(int i=0;i<=n;i++) {
			parent[i] = i;
			sz[i] = 1;
		}
	}

	int findrep(int u) {
		return parent[u] == u ? u : findrep(parent[u]);
	}

	void unite(int u,int v,int cst) {
		u=findrep(u);
		v=findrep(v);
		if(u == v) return;

		if(sz[u] > sz[v]) swap(u,v);

		parent[u] = v;
		sz[v] += sz[u];
		g[v].push_back(u);
		w[v].push_back(cst);
		pc[u] = cst;

	}
	void dfs(int u) {
		in[u] = ++T;
		id[T] = u;

		for(int v : g[u]) {
			dfs(v);
		}
		out[u] = T;
	}


	pii range(int u, int tm,bool f) {
		if(f)
		    while(parent[u] != u && pc[u] >= tm) u = parent[u];
		else 
			while(parent[u] != u && pc[u] <= tm) u = parent[u];

		int p;
		if(f) {
			p = upper_bound(w[u].begin(),w[u].end(),tm,[](int a,int b) {
				return a > b;
			}) - w[u].begin();
		} else {
			p = upper_bound(w[u].begin(),w[u].end(),tm) - w[u].begin();
		}
		

		if(p == 0) {
			return {in[u], in[u]};
		}

		int v = g[u][p-1];
		return {in[u],out[v]};
	}


} hum,wlf ;



int U[2*mxn],V[2*mxn];

struct BIT
{
	int bit[mxn];
	void init() {
		memset(bit,0,sizeof bit);
	}	

	void update(int p,int v) {
		if(p==0) return;
		for(;p<mxn;p+=p&-p) bit[p] += v;
	}
    int query(int p) {
    	int r=0;
    	for(;p>0;p-=p&-p) r+=bit[p];
        return r;
    }
} bt;

struct Query {
	int L1,R1,L2,R2;
	int v;
	int ind;

	Query(int a,int b,int c,int d,int i) : L1(a),R1(b),L2(c),R2(d),ind(i) {};
};

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 m = X.size();
	for(int i = 0 ; i < m; i++) {
		U[i] = min(X[i],Y[i]), V[i] = max(X[i],Y[i]);
	}
	vector<int> p1,p2;
	for(int i = 0; i < m; i++) {
		p1.push_back(i); 
		p2.push_back(i);
	}

	sort(p1.begin(),p1.end(),[](int a,int b) {
		return U[a] > U[b];
	});

	sort(p2.begin(),p2.end(),[](int a,int b) {
		return V[a] < V[b];
	});

	hum.init(N);
	wlf.init(N);

	int  q = S.size();

	vector<int> res(q); 

	

	for(int i : p1) {
		hum.unite(U[i],V[i],U[i]);
	}

	for(int i : p2) {
		wlf.unite(U[i],V[i],V[i]);
	}

	for(int i = 0; i < N;i++) {
		if(hum.parent[i] == i) hum.dfs(i);
		if(wlf.parent[i] == i) wlf.dfs(i);
	}


	vector<Query> Q;

	vector<int> sp[mxn];
	vector<int> ep[mxn];

	

	for(int i = 0; i < q; i++) {
		pii x = hum.range(S[i],L[i],true);
		pii y = wlf.range(E[i],R[i],false);
		Q.push_back(Query(x.f,x.s,y.f,y.s,i));
		sp[x.f].push_back(i);
		ep[x.s].push_back(i);

	}

	bt.init();



	for(int i = 1 ; i <= N; i++ ) {
	
		for(int j : sp[i]) {
			Q[j].v = bt.query(Q[j].R2) - bt.query(Q[j].L2 - 1);
		}

		bt.update(wlf.in[hum.id[i]],1);
		for(int j : ep[i]) {
			int t = bt.query(Q[j].R2) - bt.query(Q[j].L2 - 1);
			if(t > Q[j].v) 
				res[j] = 1;
		}



	} 

	return res;




}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...