2023-07-31 ABC040 D を解いた
bouzuya/tsukota のデータを PC からスクリプトで更新できるようにしたい。その準備として models パッケージを追加した。
- 道路の老朽化対策について (AtCoder Beginner Contest 040:D問題)
https://atcoder.jp/contests/abc040/tasks/abc040_d- https://atcoder.jp/contests/abc040/submissions/44123471
- ある時点で使用可能な道路を Dsu で管理する
- Dsu は連結はできても分割はできないので年の新しい順 (降順) で道路を追加していく
- 国民についても合わせて並べて調べれば良い
 
use dsu::*;
use proconio::{input, marker::Usize1};
fn main() {
    input! {
        n: usize,
        m: usize,
        aby: [(Usize1, Usize1, usize); m],
        q: usize,
        vw: [(Usize1, usize); q],
    };
    #[derive(Clone, Copy, Debug)]
    enum Query {
        Road { a: usize, b: usize, y: usize },
        Citizen { j: usize, v: usize, w: usize },
    }
    use Query::*;
    let mut queries = vec![];
    for (a, b, y) in aby {
        queries.push(Road { a, b, y });
    }
    for (j, (v, w)) in vw.iter().copied().enumerate() {
        queries.push(Citizen { j, v, w });
    }
    queries.sort_by_key(|q| match q {
        Road { y, .. } => *y,
        Citizen { w, .. } => *w,
    });
    let mut ans = vec![0; q];
    let mut dsu = Dsu::new(n);
    for q in queries.iter().copied().rev() {
        match q {
            Road { a, b, .. } => {
                dsu.merge(a, b);
            }
            Citizen { j, v, .. } => {
                ans[j] = dsu.size(v);
            }
        }
    }
    for a in ans {
        println!("{}", a);
    }
}
// dsu
今日のコミット。