結果
問題 | No.1170 Never Want to Walk |
ユーザー | 草苺奶昔 |
提出日時 | 2023-03-29 22:48:21 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 421 ms / 2,000 ms |
コード長 | 2,934 bytes |
コンパイル時間 | 335 ms |
コンパイル使用メモリ | 82,128 KB |
実行使用メモリ | 120,624 KB |
最終ジャッジ日時 | 2024-09-21 13:44:54 |
合計ジャッジ時間 | 9,706 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 63 ms
66,688 KB |
testcase_01 | AC | 71 ms
66,476 KB |
testcase_02 | AC | 70 ms
66,304 KB |
testcase_03 | AC | 64 ms
66,688 KB |
testcase_04 | AC | 65 ms
66,688 KB |
testcase_05 | AC | 63 ms
66,176 KB |
testcase_06 | AC | 64 ms
66,304 KB |
testcase_07 | AC | 63 ms
66,304 KB |
testcase_08 | AC | 66 ms
66,432 KB |
testcase_09 | AC | 64 ms
66,304 KB |
testcase_10 | AC | 63 ms
66,304 KB |
testcase_11 | AC | 65 ms
67,072 KB |
testcase_12 | AC | 94 ms
77,380 KB |
testcase_13 | AC | 95 ms
77,332 KB |
testcase_14 | AC | 95 ms
77,312 KB |
testcase_15 | AC | 91 ms
77,312 KB |
testcase_16 | AC | 92 ms
77,460 KB |
testcase_17 | AC | 92 ms
77,508 KB |
testcase_18 | AC | 91 ms
77,608 KB |
testcase_19 | AC | 92 ms
77,752 KB |
testcase_20 | AC | 95 ms
77,312 KB |
testcase_21 | AC | 95 ms
77,440 KB |
testcase_22 | AC | 93 ms
77,380 KB |
testcase_23 | AC | 95 ms
77,684 KB |
testcase_24 | AC | 96 ms
77,376 KB |
testcase_25 | AC | 92 ms
77,424 KB |
testcase_26 | AC | 96 ms
77,440 KB |
testcase_27 | AC | 362 ms
119,940 KB |
testcase_28 | AC | 360 ms
119,872 KB |
testcase_29 | AC | 421 ms
120,364 KB |
testcase_30 | AC | 365 ms
120,092 KB |
testcase_31 | AC | 379 ms
119,836 KB |
testcase_32 | AC | 262 ms
120,492 KB |
testcase_33 | AC | 317 ms
120,056 KB |
testcase_34 | AC | 306 ms
120,340 KB |
testcase_35 | AC | 307 ms
120,624 KB |
testcase_36 | AC | 265 ms
119,840 KB |
testcase_37 | AC | 297 ms
119,936 KB |
testcase_38 | AC | 274 ms
120,132 KB |
ソースコード
from bisect import bisect_left, bisect_right from typing import Callable, Optional class RangeUnionFind: ___slots___ = ("_data", "_left", "_right") def __init__(self, n: int): self._data = [-1] * n self._left = list(range(n)) # 每个组的左边界 self._right = [i + 1 for i in range(n)] # 每个组的右边界 def find(self, x: int) -> int: if self._data[x] < 0: return x self._data[x] = self.find(self._data[x]) return self._data[x] def union(self, x: int, y: int, f: Optional[Callable[[int, int], None]] = None) -> bool: """ f: 合并时的回调函数,参数为合并后的根节点 (big, small) """ rootX = self.find(x) rootY = self.find(y) if rootX == rootY: return False if self._data[rootX] > self._data[rootY]: rootX, rootY = rootY, rootX self._data[rootX] += self._data[rootY] self._data[rootY] = rootX if self._left[rootY] < self._left[rootX]: self._left[rootX] = self._left[rootY] if self._right[rootY] > self._right[rootX]: self._right[rootX] = self._right[rootY] if f is not None: f(rootX, rootY) return True def unionRange( self, start: int, end: int, f: Optional[Callable[[int, int], None]] = None ) -> int: """合并`左闭右开区间[start, end)`,返回新合并的个数(次数)""" if start < 0: start = 0 if end > len(self._data): end = len(self._data) if start >= end: return 0 m, count = 0, 0 while True: m = self._right[self.find(start)] if m >= end: break self.union(start, m, f) count += 1 return count def isConnected(self, x: int, y: int) -> bool: return self.find(x) == self.find(y) def size(self, x: int) -> int: return -self._data[self.find(x)] if __name__ == "__main__": # No.1170 Never Want to Walk # https://yukicoder.me/problems/no/1170 # 数轴上有n个车站,第i个位置在xi # 如果两个车站之间的距离di与dj满足 A<=|di-dj|<=B,则这两个车站可以相互到达,否则不能相互到达 # 对每个车站,求出从该车站出发,可以到达的车站的数量 # 1<=n<=2e5 0<=A<=B<=1e9 0<=x1<=x2<...<=xn<=1e9 # !每个车站向右合并可以到达的车站,把合并分解为单点合并+区间合并 n, A, B = map(int, input().split()) pos = list(map(int, input().split())) uf = RangeUnionFind(n) for i, p in enumerate(pos): left = bisect_left(pos, p + A) right = bisect_right(pos, p + B) if left != right: # 有可以到达的车站 uf.union(i, left) uf.unionRange(left, right) for i in range(n): print(uf.size(i))