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