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
今日のコミット。