結果
| 問題 | 
                            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