結果
| 問題 | 
                            No.1170 Never Want to Walk
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2024-08-05 18:00:58 | 
| 言語 | Rust  (1.83.0 + proconio)  | 
                    
| 結果 | 
                             
                                RE
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 1,820 bytes | 
| コンパイル時間 | 25,596 ms | 
| コンパイル使用メモリ | 399,436 KB | 
| 実行使用メモリ | 53,140 KB | 
| 最終ジャッジ日時 | 2024-08-05 18:01:29 | 
| 合計ジャッジ時間 | 23,279 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge2 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 2 | 
| other | AC * 11 RE * 14 TLE * 1 -- * 11 | 
ソースコード
use std::collections::{HashMap, HashSet};
fn main() {
    proconio::input! {
        n: usize,
        a: i64,
        b: i64,
        x: [i64; n],
    }
    let mut stations: HashMap<usize, HashSet<usize>> =
        (0..n).into_iter().map(|i| (i, HashSet::new())).collect();
    for i in 0..n {
        for j in (0..i).rev().skip(1) {
            let abs = (x[j] - x[i]).abs();
            if between(a, b, abs) {
                stations.get_mut(&i).unwrap().insert(j);
            } else if abs > b {
                break;
            }
        }
        for j in (i..n).skip(1) {
            let abs = (x[j] - x[i]).abs();
            if between(a, b, abs) {
                stations.get_mut(&i).unwrap().insert(j);
            } else if abs > b {
                break;
            }
        }
    }
    let mut groups = vec![];
    loop {
        let mut visited = HashSet::new();
        if let Some(s) = stations.iter().find(|x| !x.1.is_empty()) {
            visited.insert(*s.0);
        } else {
            break;
        }
        loop {
            let mut inserted = false;
            for s in visited.clone() {
                for v in stations.get(&s).unwrap().iter() {
                    inserted |= visited.insert(*v);
                }
            }
            if !inserted {
                break;
            }
        }
        for v in visited.iter() {
            stations.remove(v);
        }
        groups.push(visited);
    }
    for s in stations {
        groups.push(HashSet::from_iter([s.0]));
    }
    let stations = (0..n)
        .into_iter()
        .map(|i| groups.iter().find(|x| x.contains(&i)).unwrap().len())
        .collect::<Vec<usize>>();
    for s in stations {
        println!("{}", s);
    }
}
fn between(a: i64, b: i64, x: i64) -> bool {
    a <= x && x <= b
}