結果
| 問題 |
No.1170 Never Want to Walk
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-10-07 19:35:09 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,107 bytes |
| コンパイル時間 | 582 ms |
| コンパイル使用メモリ | 82,604 KB |
| 実行使用メモリ | 104,040 KB |
| 最終ジャッジ日時 | 2025-10-07 19:35:16 |
| 合計ジャッジ時間 | 6,647 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 17 WA * 20 |
ソースコード
import sys
import bisect
# 再帰の制限を緩和(Nが大きい場合に対応)
sys.setrecursionlimit(10**6)
class StationConnectivity:
def __init__(self, num_station):
self.parent = [-1] * num_station
self.rightmost = list(range(num_station))
def find(self, i):
if self.parent[i] < 0:
return i
else:
self.parent[i] = self.find(self.parent[i])
return self.parent[i]
def union(self, x, y):
x_root = self.find(x)
y_root = self.find(y)
if x_root != y_root:
if self.parent[x_root] > self.parent[y_root]:
x_root, y_root = y_root, x_root
self.parent[x_root] += self.parent[y_root]
self.parent[y_root] = x_root
self.rightmost[x_root] = max(self.rightmost[x_root], self.rightmost[y_root])
def count_reachable(self, i):
return -self.parent[self.find(i)]
def main():
N, A, B = map(int, input().split())
xi = list(map(int, input().split()))
railway = StationConnectivity(N)
for i in range(N):
left_coord = xi[i] - B
right_coord = xi[i] - A
start_index = bisect.bisect_left(xi, left_coord, hi=i)
j = start_index
while j < i:
if xi[j] > right_coord:
break
# ▼▼▼▼▼▼▼▼▼▼▼【最終修正点】▼▼▼▼▼▼▼▼▼▼▼
root_j_before_union = railway.find(j)
# unionする前に、ジャンプに必要なrightmostの値を保存しておく
rightmost_value_before_union = railway.rightmost[root_j_before_union]
railway.union(i, j)
# 保存しておいた値を使って、次のジャンプ先を安全に計算する
j = rightmost_value_before_union + 1
# ▲▲▲▲▲▲▲▲▲▲▲【最終修正点】▲▲▲▲▲▲▲▲▲▲▲
for i in range(N):
print(railway.count_reachable(i))
if __name__ == "__main__":
main()