제출 #47615

#제출 시각아이디문제언어결과실행 시간메모리
47615IvanC사육제 (CEOI14_carnival)C++17
20 / 100
92 ms772 KiB
#include <bits/stdc++.h> using namespace std; knuth_b gen(rand() % rand() + rand()); 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...