結果
| 問題 |
No.2316 Freight Train
|
| コンテスト | |
| ユーザー |
かとぅー ☆
|
| 提出日時 | 2023-09-05 15:07:34 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 727 ms / 2,000 ms |
| コード長 | 1,383 bytes |
| コンパイル時間 | 686 ms |
| コンパイル使用メモリ | 82,132 KB |
| 実行使用メモリ | 109,568 KB |
| 最終ジャッジ日時 | 2024-06-23 10:43:16 |
| 合計ジャッジ時間 | 19,610 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 26 |
ソースコード
N, Q = map(int, input().split())
P = list(map(int, input().split()))
class unionfind:
# n 頂点の Union-Find 木を作成
# (ここでは頂点番号が 1-indexed になるように実装しているが、0-indexed の場合は par, size のサイズは n でよい)
def __init__(self, n):
self.n = n
self.par = [ -1 ] * (n + 1) # 最初は親が無い
self.size = [ 1 ] * (n + 1) # 最初はグループの頂点数が 1
# 頂点 x の根を返す関数
def root(self, x):
# 1 個先(親)がなくなる(つまり根に到達する)まで、1 個先(親)に進み続ける
while self.par[x] != -1:
x = self.par[x]
return x
# 要素 u, v を統合する関数
def unite(self, u, v):
rootu = self.root(u)
rootv = self.root(v)
if rootu != rootv:
# u と v が異なるグループのときのみ処理を行う
if self.size[rootu] < self.size[rootv]:
self.par[rootu] = rootv
self.size[rootv] += self.size[rootu]
else:
self.par[rootv] = rootu
self.size[rootu] += self.size[rootv]
# 要素 u と v が同一のグループかどうかを返す関数
def same(self, u, v):
return self.root(u) == self.root(v)
uf = unionfind(N)
for i in range(N):
if P[i] != -1:
uf.unite(i+1, P[i])
for i in range(Q):
a, b = map(int, input().split())
if uf.same(a, b):
print("Yes")
else:
print("No")
かとぅー ☆