結果
| 問題 |
No.2643 Many Range Sums Problems
|
| コンテスト | |
| ユーザー |
PNJ
|
| 提出日時 | 2024-02-19 22:16:49 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,840 bytes |
| コンパイル時間 | 308 ms |
| コンパイル使用メモリ | 82,512 KB |
| 実行使用メモリ | 88,516 KB |
| 最終ジャッジ日時 | 2024-09-29 02:13:14 |
| 合計ジャッジ時間 | 29,129 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 27 WA * 7 |
ソースコード
class WeightedUnionFind:
def __init__(self, n):
self.par = [i for i in range(n+1)]
self.rank = [0] * (n+1)
# 根への距離を管理
self.weight = [0] * (n+1)
# 検索
def find(self, x):
if self.par[x] == x:
return x
else:
y = self.find(self.par[x])
# 親への重みを追加しながら根まで走査
self.weight[x] += self.weight[self.par[x]]
self.par[x] = y
return y
# 併合
def union(self, x, y, w):
rx = self.find(x)
ry = self.find(y)
# xの木の高さ < yの木の高さ
if self.rank[rx] < self.rank[ry]:
self.par[rx] = ry
self.weight[rx] = w - self.weight[x] + self.weight[y]
# xの木の高さ ≧ yの木の高さ
else:
self.par[ry] = rx
self.weight[ry] = -w - self.weight[y] + self.weight[x]
# 木の高さが同じだった場合の処理
if self.rank[rx] == self.rank[ry]:
self.rank[rx] += 1
# 同じ集合に属するか
def same(self, x, y):
return self.find(x) == self.find(y)
# xからyへのコスト
def diff(self, x, y):
return self.weight[x] - self.weight[y]
def Map():
return list(map(int,input().split()))
inf = 10**18
N,K = Map()
E = []
for j in range(N):
R,X = Map()
E.append((j,R,X))
for j in range(N):
uf = WeightedUnionFind(N)
ans = 'Yes'
for i,r,x in E:
if i == j:
continue
if uf.same(i,r):
if uf.diff(i,r) == x:
continue
else:
ans = 'No'
break
else:
uf.union(i,r,x)
for i in range(1,N+1):
if not uf.same(i-1,i):
continue
if 0 <= uf.diff(i-1,i) <= K:
continue
ans = 'No'
break
print(ans)
PNJ