結果
問題 |
No.2290 UnUnion Find
|
ユーザー |
|
提出日時 | 2025-07-15 18:12:37 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,097 bytes |
コンパイル時間 | 3,511 ms |
コンパイル使用メモリ | 284,928 KB |
実行使用メモリ | 11,728 KB |
最終ジャッジ日時 | 2025-07-15 18:12:54 |
合計ジャッジ時間 | 16,378 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 7 WA * 39 |
ソースコード
#include <bits/stdc++.h> // #include <atcoder/all> // using namespace atcoder; using namespace std; using ll = long long; using ld = long double; using pll = pair<ll, ll>; using int128 = __int128; using State = string::const_iterator; class ParseError {}; #define rep(i, n) for(ll i = 0; i < (n); i++) #define reps(i, l, r) for(ll i = (l); i < (r); i++) #define all(a) (a).begin(), (a).end() #define rall(a) (a).rbegin(), (a).rend() // #define endl "\n"; const ll INF = LLONG_MAX / 4; const ld inf = numeric_limits<long double>::max() / (ld)4; const ll mod1 = 1000000007; const ll mod2 = 998244353; const ld pi = 3.1415926535897; ll dx[8] = {1, 1, 0, -1, -1, -1, 0, 1}; ll dy[8] = {0, -1, -1, -1, 0, 1, 1, 1}; template <typename T> bool chmax(T &a, const T& b) { if (a < b) { a = b; return true; } return false; } template <typename T> bool chmin(T &a, const T& b) { if (a > b) { a = b; return true; } return false; } const string TERM_RED = "\033[31m"; const string TERM_RESET = "\033[0m"; template <typename T> void dump(const T &val) { cerr << TERM_RED << "[[ DEBUG ]] " << val << TERM_RESET << std::endl; } using pii = pair<int, int>; using vb = vector<bool>; using vvb = vector<vb>; template<typename T> using vec = vector<T>; struct dsu { public: dsu() : _n(0) {} explicit dsu(int n) : _n(n), parent_or_size(n, -1) {} int merge(int a, int b) { assert(0 <= a && a < _n); assert(0 <= b && b < _n); int x = leader(a), y = leader(b); if (x == y) return x; if (-parent_or_size[x] < -parent_or_size[y]) std::swap(x, y); parent_or_size[x] += parent_or_size[y]; parent_or_size[y] = x; return x; } bool same(int a, int b) { assert(0 <= a && a < _n); assert(0 <= b && b < _n); return leader(a) == leader(b); } int leader(int a) { assert(0 <= a && a < _n); if (parent_or_size[a] < 0) return a; return leader(parent_or_size[a]); } int size(int a) { assert(0 <= a && a < _n); return -parent_or_size[leader(a)]; } std::vector<std::vector<int>> groups() { std::vector<int> leader_buf(_n), group_size(_n); for (int i = 0; i < _n; i++) { leader_buf[i] = leader(i); group_size[leader_buf[i]]++; } std::vector<std::vector<int>> result(_n); for (int i = 0; i < _n; i++) { result[i].reserve(group_size[i]); } for (int i = 0; i < _n; i++) { result[leader_buf[i]].push_back(i); } result.erase( std::remove_if(result.begin(), result.end(), [&](const std::vector<int>& v) { return v.empty(); }), result.end()); return result; } private: int _n; // root node: -1 * component size // otherwise: parent std::vector<int> parent_or_size; }; int solve() { int n, q; cin >> n >> q; dsu uf(n); vec<int> queries; vec<int> ans(q, 0); vec<vec<int>> waiting(n); rep(i, q) { int t; cin >> t; if(t == 1) { int u, v; cin >> u >> v; u--; v--; if(uf.same(u, v)) continue; for(auto e : waiting[uf.leader(u)]) { ans[e] = v+1; } waiting[uf.leader(u)].clear(); for(auto e : waiting[uf.leader(v)]) { ans[e] = u+1; } waiting[uf.leader(v)].clear(); uf.merge(u, v); } else { int v; cin >> v; v--; if(uf.size(v) == n) ans[i] = -1; else waiting[uf.leader(v)].push_back(i); } } rep(i, n) { if(uf.same(0, i)) continue; cout << i << endl; for(auto e : waiting[0]) { ans[e] = i+1; } waiting[0].clear(); for(auto e : waiting[i]) { ans[e] = 1; } waiting[i].clear(); uf.merge(0, i); } rep(i, q) { if(ans[i] != 0) cout << ans[i] << endl; } return 0; } int main(){ cin.tie(nullptr); ios_base::sync_with_stdio(false); cout << fixed << setprecision(20); int t = 1; while(t) { // dump("case"); t = solve(); } }