結果
| 問題 |
No.2290 UnUnion Find
|
| コンテスト | |
| ユーザー |
yassu0320
|
| 提出日時 | 2023-05-06 17:54:42 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 812 ms / 2,000 ms |
| コード長 | 3,282 bytes |
| コンパイル時間 | 427 ms |
| コンパイル使用メモリ | 82,048 KB |
| 実行使用メモリ | 116,224 KB |
| 最終ジャッジ日時 | 2024-11-24 00:38:09 |
| 合計ジャッジ時間 | 35,848 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 46 |
ソースコード
#!/usr/bin/env pypy3
from pprint import pprint
from string import ascii_lowercase as letter
from sys import setrecursionlimit, stderr, stdin
from typing import Dict, Generic, Iterable, Iterator, List, Optional, Set, TypeVar, Union
try:
import pypyjit
pypyjit.set_param('max_unroll_recursion=-1')
except ModuleNotFoundError:
...
INF: int = (1 << 62) - 1
MOD1000000007 = 10**9 + 7
MOD998244353 = 998244353
setrecursionlimit(500_000) # 5*10**5
readline = stdin.readline
input = lambda: stdin.readline().rstrip('\r\n')
def copy2d(a: list) -> list:
return [[y for y in x] for x in a]
def copy3d(a: list) -> list:
return [[[z for z in y] for y in x] for x in a]
def flattern2d(mat: list) -> list:
return [x for a in mat for x in a]
def debug(*a):
pprint(a, stream=stderr)
def inputs(type_=int, one_word=False) -> list:
in_ = input()
if one_word:
ins = list(in_)
else:
ins = in_.split()
if isinstance(type_, Iterable):
return [t(x) for t, x in zip(type_, ins)]
else:
return list(map(type_, ins))
def input_iter(size, type_: type = int, one_word: bool = False):
for _ in range(size):
yield inputs(type_=type_, one_word=one_word)
def inputi() -> int:
return int(readline())
yn = ['no', 'yes']
Yn = ['No', 'Yes']
YN = ['NO', 'YES']
# start coding
# {{{ UnionFind
class UnionFind:
"""
Ref: github.com/cheran-senthil/PyRival/blob/master/pyrival/data_structures/DisjointSetUnion.py
"""
def __init__(self, n):
self.parent = list(range(n))
self.n = n
self._size = [1] * n
self.num_groups = n
def find(self, a: int) -> int:
acopy = a
while a != self.parent[a]:
a = self.parent[a]
while acopy != a:
self.parent[acopy], acopy = a, self.parent[acopy]
return a
def union(self, a: int, b: int) -> int:
a, b = self.find(a), self.find(b)
if a == b:
return a
if self._size[a] < self._size[b]:
a, b = b, a
self.num_groups -= 1
self.parent[b] = a
self._size[a] += self._size[b]
return a
def same(self, a: int, b: int) -> bool:
return self.find(a) == self.find(b)
def size(self, a) -> int:
return self._size[self.find(a)]
def groups(self):
"""
計算量: O(n * log(n) * alpha(n))
"""
gs = dict()
for u in range(self.n):
p = self.find(u)
if p not in gs:
gs[p] = []
gs[p].append(u)
return list(gs.values())
def __len__(self):
return self.num_groups
# }}}
n, q = inputs()
uf = UnionFind(n)
s = set()
for u in range(n):
s.add(u)
for _ in range(q):
t, *args = inputs()
if t == 1:
u, v = args
u -= 1
v -= 1
r = uf.find(u)
s.discard(r)
r = uf.find(v)
s.discard(r)
r = uf.union(u, v)
s.add(r)
else:
if len(s) == 1:
print(-1)
continue
v, = args
v -= 1
r1, r2 = s.pop(), s.pop()
if uf.find(v) == r1:
print(r2 + 1)
else:
print(r1 + 1)
s.add(r1)
s.add(r2)
yassu0320