結果
問題 | No.1054 Union add query |
ユーザー | southball02 |
提出日時 | 2020-05-15 22:01:51 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,652 bytes |
コンパイル時間 | 2,024 ms |
コンパイル使用メモリ | 201,912 KB |
実行使用メモリ | 14,344 KB |
最終ジャッジ日時 | 2024-09-19 10:29:49 |
合計ジャッジ時間 | 5,730 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 4 ms
14,344 KB |
testcase_01 | AC | 4 ms
7,432 KB |
testcase_02 | AC | 3 ms
7,252 KB |
testcase_03 | TLE | - |
testcase_04 | -- | - |
testcase_05 | -- | - |
testcase_06 | -- | - |
testcase_07 | -- | - |
testcase_08 | -- | - |
testcase_09 | -- | - |
testcase_10 | -- | - |
ソースコード
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() typedef long long ll; typedef pair<int, int> pii; typedef vector<int> vi; template<typename H> bool chmin(H& v1, const H v2) { if (v1 > v2) { v1 = v2; return true; } return false; } template<typename H> bool chmax(H& v1, const H v2) { if (v1 < v2) { v1 = v2; return true; } return false; } template<typename H> void read(H& head) { cin >> head; } template<typename H, typename ...T> void read(H& head, T& ...tail) { cin >> head; read(tail...); } template<typename H> void write(H head) { cout << head << '\n'; } template<typename H, typename ...T> void write(H head, T ...tail) { cout << head << " "; write(tail...); } template<typename ...T> void die(T ...tok) { write(tok...); exit(0); } struct Dsu { int dsu[500005]; int v[500005]; Dsu() { fill(dsu, dsu + 500005, -1), fill(v, v + 500005, 0); } int find(int x) { return dsu[x] < 0 ? x : find(dsu[x]); } void merge(int a, int b) { a = find(a), b = find(b); if (a == b) return; // union by rank int ra = -dsu[a], rb = -dsu[b]; if (ra < rb) swap(a, b); // glue u <- v dsu[b] = a; while (a >= 0) { v[b] -= v[a]; a = dsu[a]; } } }; Dsu dsu; int main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); int n, q; read(n, q); rep(i, 0, q) { int t, a, b; read(t, a, b); if (t == 1) { dsu.merge(a, b); } else if (t == 2) { a = dsu.find(a); dsu.v[a] += b; } else if (t == 3) { int cv = 0; while (a >= 0) { cv += dsu.v[a]; a = dsu.dsu[a]; } write(cv); } } }