今日気づいたのだけど、昨日で 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