結果
| 問題 |
No.1054 Union add query
|
| コンテスト | |
| ユーザー |
ikd
|
| 提出日時 | 2020-05-15 22:04:16 |
| 言語 | Nim (2.2.0) |
| 結果 |
AC
|
| 実行時間 | 581 ms / 2,000 ms |
| コード長 | 1,245 bytes |
| コンパイル時間 | 4,196 ms |
| コンパイル使用メモリ | 66,584 KB |
| 実行使用メモリ | 42,940 KB |
| 最終ジャッジ日時 | 2024-09-19 10:35:43 |
| 合計ジャッジ時間 | 7,864 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 8 |
ソースコード
import strutils, sequtils
let read = iterator: string {.closure.} =
for s in stdin.readAll.split:
yield s
type U = object
root: seq[int]
acc: seq[int64]
val: seq[int64]
nodes: seq[seq[int]]
proc init(n: int): U =
return U(
root: toSeq(0..(n - 1)),
acc: newSeqWith(n, 0.int64),
val: newSeqWith(n, 0.int64),
nodes: toSeq(0..(n - 1)).mapIt(@[it]))
proc find(u: var U, i: int): int =
if u.root[i] != i:
u.root[i] = u.find(u.root[i])
return u.root[i]
proc unite(u: var U, i0, j0: int) =
var
i = u.find(i0)
j = u.find(j0)
if i == j:
return
if u.nodes[i].len < u.nodes[j].len:
swap(i, j)
u.root[j] = i
# echo "> ", i, " ", j, " ", u.nodes[j]
let
a = u.acc[j]
b = u.acc[i]
for k in u.nodes[j]:
u.val[k] += a
u.val[k] -= b
u.acc[k] = 0
u.nodes[i].add(k)
u.nodes[j] = @[]
proc get(u: var U, i: int): int64 = u.acc[u.find(i)] + u.val[i]
proc add(u: var U, i: int, x: int) =
u.acc[u.find(i)] += x
proc main() =
let n, q = read().parseInt
var u = init(n)
for qq in 0..<q:
let t, a, b = read().parseInt
if t == 1:
u.unite(a - 1, b - 1)
elif t == 2:
u.add(a - 1, b)
else:
echo u.get(a - 1)
# echo u.acc
main()
ikd