제출 #1159462

#제출 시각아이디문제언어결과실행 시간메모리
1159462Gr1sen늑대인간 (IOI18_werewolf)C++20
0 / 100
716 ms274732 KiB
#include "werewolf.h"
#include<iostream>
#include<queue>
#include<unordered_set>
#include<algorithm>
#include<iomanip>

using namespace std;

#define vi vector<int>
#define vvi vector<vi>
#define pi pair<int, int>
#define us unordered_set<int>
#define vp vector<pi>
#define vvp vector<vp>

vvi Adj;

void us_print(us& L1) {
	cerr << "{";
	for (auto i : L1) {
		cerr << i << ", ";
	}
	cerr << "}";
}

struct treeNode {
	int v = -1;
	int par = -1;
	us US;

	void print() {
		cerr << "treeNode : {";
		cerr << "v : " << v << ", ";
		cerr << "par : " << par << ", ";
		cerr << "US : ";
		us_print(US);
		cerr << "}" << endl;
	}

	void merge(us US2) {
		if (US2.size() > US.size()) swap(US2, US);
		for (auto i : US2) {
			US.insert(i);
		}
	}
};

vector<treeNode> TN1, TN2;

int find(int a, vector<treeNode> &TN){
	//cerr << "find " << a << endl;
	return TN[a].par == -1 ? a : TN[a].par = find(TN[a].par, TN);
}

void print(vector<treeNode>& L1) {
	for (auto i : L1) {
		i.print();
	}
}

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 = S.size();
	vi A(Q, -1);
	Adj = vvi(N);
	TN1 = vector<treeNode>(N);
	TN2 = vector<treeNode>(N);
	for (int i = 0; i < X.size(); i++) {
		Adj[X[i]].push_back(Y[i]);
		Adj[Y[i]].push_back(X[i]);
	}

	vp LS(Q), RS(Q);
	for (int i = 0; i < Q; i++) {
		LS[i] = {L[i], i};
		RS[i] = {R[i], i};
	}
	sort(LS.begin(), LS.end());
	sort(RS.begin(), RS.end());

	int rsp = 0;
	for (int i = 0; i < N; i++) {
		//cerr << i << endl;
		TN1[i].v = i;
		for (auto j : Adj[i]) {
			if (j > i) continue;
			if (find(j, TN1) != i) {
				TN1[find(j, TN1)].par = i;
			}
		}
		while (rsp < Q && RS[rsp].first <= i) {
			//cerr << "rsp : " << rsp << endl;
			int a = RS[rsp].second;
			//cerr << "a : " << a << endl;
			TN1[find(E[a], TN1)].US.insert(a);
			rsp++;
		} 
	}

	//print(TN1);

	int lsp = Q-1;
	for (int i = N-1; i > -1; i--) {
		//cerr << "i : " << i << endl;
		TN2[i].v = i;
		TN2[i].US = TN1[i].US;
		for (auto j : Adj[i]) {
			//cerr << "j " << j << endl;
			if (j < i) continue;
			if (find(j, TN2) != i) {
				TN2[i].merge(TN2[find(j, TN2)].US);
				TN2[find(j, TN2)].par = i;
			}
		}
		//cerr << "oink" << endl;
		while (lsp > -1 && LS[lsp].first >= i) {
			int a = LS[lsp].second;
			int c = S[a];
			lsp--;
			//cerr << "a : " << a << endl;
			//cerr << "find(c) : " << find(c, TN2) << endl;
			treeNode& b = TN2[find(c, TN2)];
			//b.print(); 
			A[a] = (b.US.find(a) != b.US.end());
			//print(TN2);
		}
	}
	//print(TN2);
	return A;
}

/*
6 6 3
5 1
1 2
1 3
3 4
3 0
5 2
4 2 1 2
4 2 2 2
5 4 3 4
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...