AtCoder Beginners Contest 126の参加記録. 今回から6問100分になった.
D-Even Relation
頂点の木があり、頂点と間の長さがのとき、距離が偶数である頂点を全て同色で塗り分ける.
偶数の場合を0
(白), 奇数の場合を1
(黒)とする.
与えられるグラフは木なので閉路が存在しない。したがって一点を0
と決めてしまって、そこからの距離の偶奇が等しければ0
, 異なれば1
のように塗り分ければいい.
グラフの探索部分はDFSでできる.
解答
fn main() {
let n = read_one::<usize>();
let mut edge = vec![Vec::new(); n];
for _ in 0..n - 1 {
let (u, v, w) = {
let i = read::<usize>();
(i[0] - 1, i[1] - 1, i[2])
};
edge[u].push((v, w));
edge[v].push((u, w));
}
let mut color = vec![2; n];
let mut cost = vec![0; n];
let mut q = VecDeque::new();
q.push_back(0);
color[0] = 0;
while let Some(u) = q.pop_front() {
for &(v, w) in edge[u].iter() {
if color[v] != 2 { continue; }
cost[v] = cost[u] + w;
if (cost[v] - cost[u]) % 2 == 0 { color[v] = color[u]; }
else { color[v] = 1 - color[u]; }
q.push_front(v);
}
}
for i in 0..n { println!("{}", color[i]); }
}
E-1 or 2
を満たす組が組与えられる.
にはそれぞれ1
または2
が書かれている.
このとき数字が不確定なカードは何枚か.
場合分けをしてみる. が偶数の場合、は偶数となるのでとの偶奇は等しい. が奇数の場合、は奇数となるのでとの偶奇は異なる.
つまりの偶奇に依らずがわかればの数字がわかる. よって各組をグルーピングしてあげて、最終的なグループ数を求めればよい.
解答
fn main() {
let (n, m) = {
let i = read::<usize>();
(i[0], i[1])
};
let mut uf = UnionFind::new(n);
for _ in 0..m {
let (x, y, _) = {
let i = read::<usize>();
(i[0] - 1, i[1] - 1, i[2])
};
uf.unite(x, y)
}
let mut hs = HashSet::new();
for i in 0..n { hs.insert(uf.find(i)); }
println!("{}", hs.len());
}
F-XOR Matching
- は以上未満の整数をちょうど2つずつ含む
- を満たすについて, xor xor ... xor を満たす長さの数列を構築する.
解答
所感
Dでpush_front()
とするところをpush_back()
としてしまい(DFSのつもりがBFS), それに気づけなかった。
Eは最初矛盾があるケースを考えてしまい結局誤読のまま.
Fはこれから考える.
最近この時間帯に眠くなってしまうので次回は仮眠してから参加する。
Comments