| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1361878 | stuckinpandemic | ICC (CEOI16_icc) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#include "icc.h"
using namespace std;
#define endl "\n"
#define pii pair<int, int>
#define piv pair<int, vector<pii>>
class DSU {
public:
vector<int> parents;
vector<int> sizes;
int comp;
DSU(int size) : parents(size), sizes(size, 1) {
for (int i = 0; i < size; i++) { parents[i] = i; }
comp = size;
}
/** @return the "representative" node in x's component */
int find(int x) { return parents[x] == x ? x : (parents[x] = find(parents[x])); }
/** @return whether the merge changed connectivity */
bool unite(int x, int y) {
comp--;
int x_root = find(x);
int y_root = find(y);
if (x_root == y_root) { return false; }
if (sizes[x_root] < sizes[y_root]) { swap(x_root, y_root); }
sizes[x_root] += sizes[y_root];
parents[y_root] = x_root;
return true;
}
/** @return whether x and y are in the same connected component */
bool connected(int x, int y) { return find(x) == find(y); }
};
void run(int n){
DSU dsu(n);
for(int step = 1; step < n; step++){
int c = 0;
map<int, int> mp;
vector<vector<int>> connected_comp;
for(int i = 0; i < n; i++){
if(mp.count(dsu.find(i))){
connected_comp[mp[dsu.find(i)]].push_back(i);
}
else{
connected_comp.push_back({i});
mp[dsu.find(i)] == c++;
}
}
vector<int> endpoints;
for(int i = 0; i < dsu.comp; i++){
vector<int> rest;
for(int j = 0; j < dsu.comp; j++){
if(j == i) continue;
for(auto e: connected_comp[j]) rest.push_back(e);
}
for(auto e: connected_comp[i]){
int q = query(1, rest.size(), new int[]{1}, rest);
if(q == 1){
endpoints.push_back(e);
}
}
}
setRoad(endpoints[0], endpoints[1]);
dsu.unite(endpoints[0], endpoints[1]);
}
}
