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