結果
| 問題 |
No.2290 UnUnion Find
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-05-28 00:50:00 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 310 ms / 2,000 ms |
| コード長 | 2,072 bytes |
| コンパイル時間 | 1,886 ms |
| コンパイル使用メモリ | 205,688 KB |
| 最終ジャッジ日時 | 2025-02-13 09:30:45 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 46 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct Unionfind {
vector<ll> par, usiz;
ll e = 0, v;
Unionfind(ll n): par(n), usiz(n), v(n) {
for(ll i = 0; i < n; i++) {
par[i] = i;
usiz[i] = 1;
}
}
// ↓に"/"追加でコメントアウト解除
/**
Unionfind(graph g): par(g()), usiz(g()), v(g()) {
for(ll i = 0; i < v; i++) {
par[i] = i;
usiz[i] = 1;
}
for(ll i = 0; i < v; i++) {
for(auto &j : g[i]) {
if(i < j) unite(i, j);
}
}
} /**/
ll root(ll x) {
if(par[x] == x) return x;
return par[x] = root(par[x]);
}
void unite(ll x, ll y) {
x = root(x), y = root(y);
if(x == y) return;
if(usiz[x] > usiz[y]) swap(x, y);
par[x] = y;
usiz[y] += usiz[x];
e++;
}
void unite(pair<ll, ll> x) { unite(x.first, x.second); }
bool same(ll x, ll y) { return root(x) == root(y); }
bool same(pair<ll, ll> x) { return same(x.first, x.second); }
ll size(ll x) { return usiz[root(x)]; }
vector<vector<ll>> group() {
vector<vector<ll>> r(v);
for(ll i = 0; i < v; i++) r[root(i)].push_back(i);
r.erase(remove_if(begin(r), end(r), [&](vector<ll> &r_) { return r_.empty(); }));
return r;
}
ll operator[](ll i) { return root(i); }
void operator()(ll x, ll y) { unite(x, y); }
void operator()(pair<ll, ll> x) { unite(x); }
ll operator()() { return v - e; }
};
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
ll n, Q;
cin >> n >> Q;
Unionfind u(n);
set<ll> s;
for(ll i = 0; i < n; i++) s.insert(i);
while(Q--) {
ll f;
cin >> f;
if(f == 1) {
ll x, y;
cin >> x >> y;
x--, y--;
ll rx = u[x], ry = u[y];
u.unite(x, y);
if(u[x] == rx) s.erase(y);
else s.erase(x);
}
else {
ll v;
cin >> v;
v--;
if(u() == 1) cout << -1 << "\n";
else {
ll r = u[v];
for(auto &i : s) {
if(u[i] != r) {
cout << i + 1 << "\n";
break;
}
}
}
}
}
}