結果
| 問題 | No.1170 Never Want to Walk | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2025-10-07 19:07:53 | 
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) | 
| 結果 | 
                                TLE
                                 
                             | 
| 実行時間 | - | 
| コード長 | 3,009 bytes | 
| コンパイル時間 | 5,454 ms | 
| コンパイル使用メモリ | 88,872 KB | 
| 実行使用メモリ | 15,940 KB | 
| 最終ジャッジ日時 | 2025-10-07 19:08:04 | 
| 合計ジャッジ時間 | 6,836 ms | 
| ジャッジサーバーID (参考情報) | judge2 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 2 | 
| other | AC * 25 TLE * 1 -- * 11 | 
ソースコード
#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
/**
 * @brief 駅の連結情報を管理するUnion-Findデータ構造を実装したクラス
 */
class StationConnectivity {
private:
    // 各要素の親を格納する配列。
    // 負の値はその要素が根であることを示し、その絶対値が集合のサイズを表す。
    std::vector<int> parent;
public:
    /**
     * @brief コンストラクタ
     * @param num_station 駅の総数
     */
    StationConnectivity(int num_station) : parent(num_station, -1) {}
    /**
     * @brief 指定された駅が属する集合の根(代表駅)を見つける
     * @param id 駅のインデックス
     * @return int 集合の根のインデックス
     */
    int find(int id) {
        // 自身が根であれば、自身のインデックスを返す
        if (parent[id] < 0) {
            return id;
        }
        // 親を再帰的にたどり、経路圧縮を行う
        return parent[id] = find(parent[id]);
    }
    /**
     * @brief 2つの駅が属する集合を1つに統合する
     * @param id1 駅1のインデックス
     * @param id2 駅2のインデックス
     */
    void unite(int id1, int id2) {
        int root1 = find(id1);
        int root2 = find(id2);
        if (root1 != root2) {
            // サイズが小さい集合を大きい集合に統合する (union by size)
            if (parent[root1] > parent[root2]) {
                std::swap(root1, root2); // root1がより大きい集合の根になるように
            }
            // サイズを更新
            parent[root1] += parent[root2];
            // 小さい方の集合の根を大きい方の根に接続
            parent[root2] = root1;
        }
    }
    /**
     * @brief 指定された駅から到達可能な駅の総数を返す
     * @param id 駅のインデックス
     * @return int 到達可能な駅の総数
     */
    int countReachable(int id) {
        return -parent[find(id)];
    }
};
/**
 * @brief メイン処理
 */
int main() {
    // C++の標準入出力の高速化
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);
    // --- 入力処理 ---
    int num_station, A, B;
    std::cin >> num_station >> A >> B;
    std::vector<int> xi(num_station);
    for (int i = 0; i < num_station; ++i) {
        std::cin >> xi[i];
    }
    // --- メインロジック ---
    StationConnectivity railway(num_station);
    // 全ての駅のペアをチェックし、条件を満たすなら接続する (O(N^2)の処理)
    for (int i = 0; i < num_station; ++i) {
        for (int j = 0; j < i; ++j) {
            int distance = xi[i] - xi[j];
            if (distance >= A && distance <= B) {
                railway.unite(i, j);
            }
        }
    }
    // --- 出力処理 ---
    for (int i = 0; i < num_station; ++i) {
        std::cout << railway.countReachable(i) << "\n";
    }
    return 0;
}
            
            
            
        