結果
問題 | No.1170 Never Want to Walk |
ユーザー | cmy |
提出日時 | 2022-05-23 01:10:46 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 284 ms / 2,000 ms |
コード長 | 2,873 bytes |
コンパイル時間 | 212 ms |
コンパイル使用メモリ | 82,676 KB |
実行使用メモリ | 109,496 KB |
最終ジャッジ日時 | 2024-09-20 13:00:19 |
合計ジャッジ時間 | 7,588 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 37 ms
52,480 KB |
testcase_01 | AC | 38 ms
52,736 KB |
testcase_02 | AC | 40 ms
52,992 KB |
testcase_03 | AC | 37 ms
52,480 KB |
testcase_04 | AC | 39 ms
52,736 KB |
testcase_05 | AC | 39 ms
52,352 KB |
testcase_06 | AC | 38 ms
52,608 KB |
testcase_07 | AC | 38 ms
52,608 KB |
testcase_08 | AC | 39 ms
52,608 KB |
testcase_09 | AC | 38 ms
52,480 KB |
testcase_10 | AC | 39 ms
52,608 KB |
testcase_11 | AC | 39 ms
52,992 KB |
testcase_12 | AC | 61 ms
67,584 KB |
testcase_13 | AC | 65 ms
70,144 KB |
testcase_14 | AC | 68 ms
71,808 KB |
testcase_15 | AC | 61 ms
67,712 KB |
testcase_16 | AC | 67 ms
67,840 KB |
testcase_17 | AC | 71 ms
72,448 KB |
testcase_18 | AC | 61 ms
67,712 KB |
testcase_19 | AC | 62 ms
67,584 KB |
testcase_20 | AC | 70 ms
72,320 KB |
testcase_21 | AC | 61 ms
67,584 KB |
testcase_22 | AC | 69 ms
71,680 KB |
testcase_23 | AC | 78 ms
73,984 KB |
testcase_24 | AC | 61 ms
68,608 KB |
testcase_25 | AC | 60 ms
67,968 KB |
testcase_26 | AC | 74 ms
74,112 KB |
testcase_27 | AC | 234 ms
108,400 KB |
testcase_28 | AC | 245 ms
108,668 KB |
testcase_29 | AC | 284 ms
109,496 KB |
testcase_30 | AC | 242 ms
109,196 KB |
testcase_31 | AC | 256 ms
108,580 KB |
testcase_32 | AC | 208 ms
109,288 KB |
testcase_33 | AC | 202 ms
108,364 KB |
testcase_34 | AC | 212 ms
108,868 KB |
testcase_35 | AC | 206 ms
109,236 KB |
testcase_36 | AC | 198 ms
109,300 KB |
testcase_37 | AC | 205 ms
109,032 KB |
testcase_38 | AC | 208 ms
109,180 KB |
ソースコード
from bisect import bisect_left, bisect_right class UnionFind: """Union Find 木 Args: n (int): 要素数 """ def __init__(self, n: int): # 独立した n 個のノードで初期化、根の場合は絶対値がノード数 self.n = n self._parent = [-1] * n def __str__(self): return str(self.groups()) def root(self, x: int) -> int: """根の探索 Args: x (int): ノードの index Returns: int: 根の index """ if self._parent[x] < 0: return x else: # 縮約 self._parent[x] = self.root(self._parent[x]) return self._parent[x] def unite(self, x: int, y: int) -> None: """ノードの結合 Args: x (int): ノードの index y (int): ノードの index """ px = self.root(x) py = self.root(y) if px == py: return # ノード数が多い方を px、少ない方を py if self._parent[px] > self._parent[py]: px, py = py, px # py -> px self._parent[px] += self._parent[py] self._parent[py] = px def is_same(self, x: int, y: int) -> bool: """グループ 一致判定 Args: x (int): ノードの index y (int): ノードの index Returns: bool: 一致 / 不一致 """ return self.root(x) == self.root(y) def size(self, x: int) -> int: """グループ内 ノード数 Args: x (int): ノードの index Returns: int: ノード数 """ return -self._parent[self.root(x)] def roots(self) -> int: """全ての根の index を返す Yields: int: ノードの index """ for idx, rnk in enumerate(self._parent): if rnk < 0: yield idx def sizes(self) -> int: """全ての木のサイズを返す Yields: int: 木のサイズ """ for r in self.roots(): yield self.size(r) def groups(self) -> list: """全ての木を返す Yields: list: 木の一覧 """ tmp = {} for i in range(self.n): j = self.root(i) tmp[j] = tmp.get(j, []) tmp[j].append(i) for nodes in tmp.values(): yield nodes n, a, b = map(int, input().split()) *x, = map(int, input().split()) lo = 0 uf = UnionFind(n) for i in range(n-1): xi = x[i] js = bisect_left(x, xi+a, lo=lo) je = bisect_right(x, xi+b, lo=lo) - 1 if js > je: continue for j in range(js, je+1): uf.unite(i, j) lo = je - 1 for i in range(n): print(uf.size(i))