結果
問題 | No.1054 Union add query |
ユーザー | Kiri8128 |
提出日時 | 2020-05-15 22:43:00 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 895 ms / 2,000 ms |
コード長 | 1,733 bytes |
コンパイル時間 | 766 ms |
コンパイル使用メモリ | 82,308 KB |
実行使用メモリ | 211,524 KB |
最終ジャッジ日時 | 2024-09-19 11:54:39 |
合計ジャッジ時間 | 7,277 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 35 ms
57,596 KB |
testcase_01 | AC | 38 ms
57,624 KB |
testcase_02 | AC | 36 ms
57,192 KB |
testcase_03 | AC | 769 ms
183,764 KB |
testcase_04 | AC | 895 ms
208,588 KB |
testcase_05 | AC | 741 ms
180,336 KB |
testcase_06 | AC | 666 ms
183,376 KB |
testcase_07 | AC | 565 ms
180,452 KB |
testcase_08 | AC | 651 ms
177,760 KB |
testcase_09 | AC | 510 ms
211,524 KB |
testcase_10 | AC | 375 ms
169,788 KB |
ソースコード
import sys input = lambda: sys.stdin.readline().rstrip() N, Q = map(int, input().split()) P = [-1 for i in range(N)] LA = [i for i in range(N)] NE = [-1] * N def par(a): L = [] while P[a] >= 0: L.append(a) a = P[a] for l in L: P[l] = a return a def unite(a, b): if par(a) != par(b): if P[par(b)] >= P[par(a)]: if P[par(b)] == P[par(a)]: P[par(a)] -= 1 NE[LA[par(a)]] = par(b) LA[par(a)] = LA[par(b)] P[par(b)] = par(a) else: NE[LA[par(b)]] = par(a) LA[par(b)] = LA[par(a)] P[par(a)] = par(b) X = [] for _ in range(Q): t, a, b = map(int, input().split()) X.append((t, a, b)) for t, a, b in X: if t == 1: a, b = a-1, b-1 unite(a, b) DONE = [0] * N ID = [-1] * N IDI = [-1] * N c = 0 for i in range(N): if DONE[i]: continue a = par(i) ID[a] = c IDI[c] = a DONE[a] = 1 c += 1 while NE[a] >= 0: a = NE[a] ID[a] = c IDI[c] = a DONE[a] = 1 c += 1 NN = 19 BIT=[0]*(2**NN+1) def addrange(l0, r0, x=1): l, r = l0, r0 while l <= 2**NN: BIT[l] += x l += l & (-l) while r <= 2**NN: BIT[r] -= x r += r & (-r) def getvalue(r): a = 0 while r != 0: a += BIT[r] r -= r&(-r) return a P = [-1 for i in range(N)] LA = [i for i in range(N)] NE = [-1] * N ANS = [] for t, a, b in X: if t == 1: a, b = a-1, b-1 unite(a, b) elif t == 2: a -= 1 a = par(a) addrange(ID[a] + 1, ID[LA[a]] + 2, b) else: a -= 1 ANS.append(getvalue(ID[a] + 1)) print("\n".join(map(str, ANS)))