結果
| 問題 |
No.2290 UnUnion Find
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-10-13 13:56:54 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 191 ms / 2,000 ms |
| コード長 | 1,087 bytes |
| コンパイル時間 | 3,234 ms |
| コンパイル使用メモリ | 283,792 KB |
| 実行使用メモリ | 13,312 KB |
| 最終ジャッジ日時 | 2025-10-13 13:57:11 |
| 合計ジャッジ時間 | 15,423 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 46 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, s, e) for (int i = (int)(s); i < (int)(e); ++i)
struct UnionFind {
vector<int> par;
set<int> leader;
int group;
UnionFind(int N) : par(N, -1), group(N) {
rep(i, 0, N) leader.insert(i);
}
int root(int x) {
if (par[x] < 0) return x;
else return par[x] = root(par[x]);
}
bool merge(int x, int y) {
if ((x = root(x)) == (y = root(y))) return false;
if (par[x] > par[y]) swap(x, y);
par[x] += par[y];
par[y] = x;
leader.erase(y);
--group;
return true;
}
bool same(int x, int y) {
return root(x) == root(y);
}
};
int main() {
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
int N, Q;
cin >> N >> Q;
UnionFind uf(N);
rep(query, 0, Q) {
int ord;
cin >> ord;
if (ord == 1) {
int u, v;
cin >> u >> v;
--u, --v;
uf.merge(u, v);
} else {
int v;
cin >> v;
--v;
if (uf.group == 1) cout << -1 << '\n';
else {
for (int u : uf.leader) if (!uf.same(v, u)) {
cout << u + 1 << '\n';
break;
}
}
}
}
}