結果
| 問題 |
No.1170 Never Want to Walk
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-10-07 21:08:24 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,266 bytes |
| コンパイル時間 | 322 ms |
| コンパイル使用メモリ | 82,392 KB |
| 実行使用メモリ | 104,016 KB |
| 最終ジャッジ日時 | 2025-10-07 21:08:32 |
| 合計ジャッジ時間 | 7,138 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 17 WA * 20 |
ソースコード
import sys
import bisect
# 再帰の制限を緩和(Nが大きい場合に対応)
sys.setrecursionlimit(10**6)
# StationConnectivity クラスは前回と同じで問題ありません
class StationConnectivity:
def __init__(self, num_station):
self.parent = [-1] * num_station
self.max_idx = 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, i, j):
root_i = self.find(i)
root_j = self.find(j)
if root_i != root_j:
if self.parent[root_i] > self.parent[root_j]:
root_i, root_j = root_j, root_i
self.parent[root_i] += self.parent[root_j]
self.parent[root_j] = root_i
self.max_idx[root_i] = max(self.max_idx[root_i], self.max_idx[root_j])
def countReachable(self, i):
return -self.parent[self.find(i)]
def main():
try:
# 入力を高速に読み込む
input = sys.stdin.readline
num_station, A, B = map(int, input().split())
xi = list(map(int, input().split()))
except (IOError, ValueError):
return
railway = StationConnectivity(num_station)
for i in range(num_station):
start_idx = bisect.bisect_left(xi, xi[i] - B, hi=i)
end_idx = bisect.bisect_right(xi, xi[i] - A, hi=i)
# === ここからが修正箇所 ===
k = start_idx
while k < end_idx:
# kが属するグループの根を見つける
root_k = railway.find(k)
# unionする前に、次にジャンプすべき位置を確保しておく
# (kが属するグループの最大インデックス + 1)
next_k = railway.max_idx[root_k] + 1
# 駅iと駅kを連結する
railway.union(i, k)
# 事前に確保しておいた位置へジャンプする
k = next_k
# === ここまでが修正箇所 ===
for i in range(num_station):
print(railway.countReachable(i))
if __name__ == "__main__":
main()