結果
問題 | No.2290 UnUnion Find |
ユーザー |
![]() |
提出日時 | 2023-05-05 21:27:06 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 611 ms / 2,000 ms |
コード長 | 1,717 bytes |
コンパイル時間 | 1,778 ms |
コンパイル使用メモリ | 180,664 KB |
実行使用メモリ | 16,052 KB |
最終ジャッジ日時 | 2024-11-23 06:00:54 |
合計ジャッジ時間 | 28,947 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 46 |
ソースコード
#include <bits/stdc++.h>using namespace std;int main(){int N, Q;cin >> N >> Q;vector<int> t(Q), U(Q), V(Q);for (int i = 0; i < Q; i++){cin >> t[i];if (t[i] == 1){cin >> U[i] >> V[i];U[i]--;V[i]--;}if (t[i] == 2){cin >> V[i];V[i]--;}}int tv = Q + 1, fv = -1;while (tv - fv > 1){int mid = (tv + fv) / 2;vector<vector<int>> E(N);for (int i = 0; i < mid; i++){if (t[i] == 1){E[U[i]].push_back(V[i]);E[V[i]].push_back(U[i]);}}vector<bool> used(N, false);used[0] = true;queue<int> q;q.push(0);while (!q.empty()){int v = q.front();q.pop();for (int w : E[v]){if (!used[w]){used[w] = true;q.push(w);}}}if (used == vector<bool>(N, true)){tv = mid;} else {fv = mid;}}vector<vector<int>> E(N);for (int i = 0; i < fv; i++){if (t[i] == 1){E[U[i]].push_back(V[i]);E[V[i]].push_back(U[i]);}}vector<int> c(N, -1);int cnt = 0;vector<int> p;for (int i = 0; i < N; i++){if (c[i] == -1){c[i] = cnt;queue<int> q;q.push(i);while (!q.empty()){int v = q.front();q.pop();for (int w : E[v]){if (c[w] == -1){c[w] = cnt;q.push(w);}}}p.push_back(i);cnt++;}}for (int i = 0; i < Q; i++){if (t[i] == 2){if (i >= tv){cout << -1 << endl;} else if (c[V[i]] == 0){cout << p[1] + 1 << endl;} else {cout << p[0] + 1 << endl;}}}}