2023-07-29 ABC312 に参加した / ABC065 D を解いた
ABC312 に参加した。 1299 → 1312 (+13) 。 https://atcoder.jp/users/bouzuya/history/share/abc312 。 A, B, C, D の 4 完。 E はヤバそうだったのでほとんど考察なしにスキップ。 F はおおまかな考察は正しいもののうまく実装できず終了。
『シン・仮面ライダー』を観た。血が多い。
- 連結 (AtCoder Beginner Contest 065:D問題)
https://atcoder.jp/contests/arc065/tasks/arc065_b
- https://atcoder.jp/contests/arc065/submissions/44018181
 - Union-Find (Dsu) で連結成分ごとに分ける
 - 連結成分 (の代表) の組ごとの個数を数えると良い
 
 
use dsu::*;
use im_rc::HashMap;
use proconio::{input, marker::Usize1};
fn main() {
    input! {
        n: usize,
        k: usize,
        l: usize,
        pq: [(Usize1, Usize1); k],
        rs: [(Usize1, Usize1); l],
    };
    let mut dsu1 = Dsu::new(n);
    for (p, q) in pq {
        dsu1.merge(p, q);
    }
    let mut dsu2 = Dsu::new(n);
    for (r, s) in rs {
        dsu2.merge(r, s);
    }
    let mut map = HashMap::new();
    for i in 0..n {
        let key = (dsu1.leader(i), dsu2.leader(i));
        *map.entry(key).or_insert(0) += 1;
    }
    let ans = (0..n)
        .map(|i| (dsu1.leader(i), dsu2.leader(i)))
        .map(|key| map[&key])
        .collect::<Vec<usize>>();
    let mut s = String::new();
    for (i, a_i) in ans.iter().copied().enumerate() {
        s.push_str(&format!(
            "{}{}",
            a_i,
            if i == ans.len() - 1 { '\n' } else { ' ' }
        ));
    }
    print!("{}", s);
}
// dsu
今日のコミット。