제출 #47614

#제출 시각아이디문제언어결과실행 시간메모리
47614IvanC사육제 (CEOI14_carnival)C++17
20 / 100
110 ms752 KiB
#include <bits/stdc++.h>
using namespace std;

knuth_b gen(1337);

typedef pair<int,int> ii;
typedef bitset<161> bt;

const int MAXN = 161;

int pai[MAXN],cor[MAXN],N,C,conjuntos,jafoi;
bt impossivel[MAXN];

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

void atualiza(int x){
	bt novo;
	for(int i = 1;i<=N;i++){
		if(impossivel[x].test(i)) novo.set(find(i));
	}
	impossivel[x] = novo;
}

void join(int x,int y){
	x = find(x);
	y = find(y);
	if(x == y) return;
	conjuntos--;
	if(x > y) swap(x,y);
	atualiza(x);
	atualiza(y);
	pai[y] = x;
	impossivel[x] |= impossivel[y];
}

int func(int i){
	return gen() % i;
}

int main(){
	cin >> N;
	conjuntos = N;
	cout << N;
	for(int i = 1;i<=N;i++){
		cout << " ";
		cout << i;
		pai[i] = i;
	}
	cout << endl;
	cin >> C;
	vector<ii> arestas;
	for(int i = 1;i<=N;i++){
		for(int j = i + 1;j<=N;j++){
			arestas.push_back(ii(i,j));
		}
	}
	random_shuffle(arestas.begin(),arestas.end(),func);
	while(conjuntos != C && !arestas.empty()){
		int u = arestas.back().first;
		int v = arestas.back().second;
		arestas.pop_back();
		u = find(u);
		v = find(v);
		atualiza(u);
		atualiza(v);
		if(u == v) continue;
		if(impossivel[u].test(v)) continue;
		cout << 2 << " " << u << " " << v << endl;
		int qtd;
		cin >> qtd;
		if(qtd == 1){
			join(u,v);
		}
		else{
			impossivel[u].set(v);
			impossivel[v].set(u);
		}
	}
	cout << 0;
	for(int i = 1;i<=N;i++){
		cout << " ";
		if(cor[find(i)] == 0){
			cor[find(i)] = ++jafoi;
		}
		cout << cor[find(i)];
	}
	cout << endl;
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...