2023-10-23 PAST 本上級を読み終えた / ABC220 A, B, C, D, F
今日気づいたのだけど、昨日で PAST 本 (『アルゴリズム実技検定 公式テキスト[上級]~[エキスパート]編』)を読み終えていた。 https://book.mynavi.jp/ec/products/detail/id=135840 。 2023-05-29 から 5 ヶ月かかっている。
上級・エキスパートは自力ではほとんど解けなかった。ストレッチゾーンという感じで良かったように思う。
次はしばらく ISUCON 関連のことと業務関連のあれこれかな……。今週は Slay the Spire を控えようと思っている。
昨日 (2023-10-22) の記事に下の子のおしりたんていのことを書いておいた。おしりたんていの終わりの問いかけに毎回「たのしかったー」とこたえるのはさすがに素直すぎて怖い。 Prime Video で同じシーズンをもう 4 周くらいは観ているのに、だよ……?
bouzuya/tsukota を Pixel 7 から Pixel 8 に移行した。端末間の引き継ぎをもっと簡単にしたいな……。 Android の標準のバックアップに頼るのも手だけど……。
ABC220 : AtCoder Beginner Contest 220
- A - Find Multiple
https://atcoder.jp/contests/abc220/tasks/abc220_a
- 提出: https://atcoder.jp/contests/abc220/submissions/46878154
 a..=bでx % c == 0になるものを探してあればそれを、なければ -1 を出力
 - B - Base K
https://atcoder.jp/contests/abc220/tasks/abc220_b
- 提出: https://atcoder.jp/contests/abc220/submissions/46878190
 usize::from_str_radixで k 進数から戻してかければ良い
 - C - Long Sequence
https://atcoder.jp/contests/abc220/tasks/abc220_c
- 提出: https://atcoder.jp/contests/abc220/submissions/46878628
 - 前から走査すると間に合わないので A を何周するかを A の合計で割って求める
 - A の合計で剰余をとってそれで A をどれだけ進むかを調べれば良い
 
 - D - FG operation
https://atcoder.jp/contests/abc220/tasks/abc220_d
- 提出: https://atcoder.jp/contests/abc220/submissions/46878907
 - 左端が 
0..=9のそれぞれの場合の数を状態として持ち、先頭から走査して+と*をそれぞれ試して次の状態とすれば良い - 剰余を取りそびれて 1WA
 
 - E - Distance on Large Perfect Binary Tree
https://atcoder.jp/contests/abc220/tasks/abc220_e
- 未着手
 
 - F - Distance Sums 2
https://atcoder.jp/contests/abc220/tasks/abc220_f
- 提出: https://atcoder.jp/contests/abc220/submissions/46880698
 - 素朴に距離を求めると間に合わない
 - 差分で考える
 - 隣接している頂点の答えからの差分は、自身の部分木に含まれていないものは増え、含まれているものは減る
 - 適当に根付き木をつくって各頂点の部分木のサイズと深さ (距離) を求めておく
 - 根は深さの合計が答えになる
 - あとは前述の通り、差分で求めていけば良い
 
 - G - Isosceles Trapezium
https://atcoder.jp/contests/abc220/tasks/abc220_g
- 未着手
 
 - H - Security Camera
https://atcoder.jp/contests/abc220/tasks/abc220_h
- 未着手
 
 
use std::collections::VecDeque;
use proconio::{input, marker::Usize1};
fn dfs(edges: &[Vec<usize>], depth: &mut [usize], size: &mut [usize], u: usize, p: usize) {
    depth[u] = depth[p] + 1;
    let mut s = 1_usize;
    for v in edges[u].iter().copied() {
        if v == p {
            continue;
        }
        dfs(edges, depth, size, v, u);
        s += size[v];
    }
    size[u] = s;
}
fn main() {
    input! {
        n: usize,
        uv: [(Usize1, Usize1); n - 1],
    };
    let mut edges = vec![vec![]; n];
    for (u, v) in uv {
        edges[u].push(v);
        edges[v].push(u);
    }
    let inf = 1_usize << 60;
    let mut depth = vec![0; n];
    let mut size = vec![inf; n];
    dfs(&edges, &mut depth, &mut size, 0, 0);
    let mut ans = vec![inf; n];
    ans[0] = depth.iter().sum::<usize>() - n;
    let mut deque = VecDeque::new();
    deque.push_back(0);
    while let Some(u) = deque.pop_front() {
        for v in edges[u].iter().copied() {
            if ans[v] != inf {
                continue;
            }
            deque.push_back(v);
            ans[v] = ans[u] + (n - size[v]) - size[v];
        }
    }
    for a in ans {
        println!("{}", a);
    }
}
今日のコミット。
- rust-atcoder 1 commit
 - kireta 1 commit