2023-03-08 ABC051 の A, B, C, D を解いた
ABC051 : AtCoder Beginner Contest 051 の A, B, C, D を解いた。
- A - Haiku
https://atcoder.jp/contests/abc051/tasks/abc051_a
- 提出: https://atcoder.jp/contests/abc051/submissions/39536552
s.into_iter().map(|c| if c == ',' { ' ' } else { c }).collect::<String>()
- B - Sum of Three Integers
https://atcoder.jp/contests/abc051/tasks/abc051_b
- 提出: https://atcoder.jp/contests/abc051/submissions/39536654
O(K^3)
だと間に合わないのでX
Y
Z
の組み合わせの全探索は不可X + Y + Z = S
からX
Y
を決めればZ
も決まることが分かるX
Y
の組み合わせの全探索をして、条件を満たすものだけを数えれば間に合う
- C - Back and Forth
https://atcoder.jp/contests/abc051/tasks/abc051_c
- 提出: https://atcoder.jp/contests/abc051/submissions/39537459
- 最初
s
とt
の位置関係が固定されていることを見落として混乱していた - 実際には
s_x < t_x
s_y < t_y
の制約があることから位置関係は決まっている - 右上左下下右上上左下などの経路で最短になる
- D - Candidates of No Shortest Paths
https://atcoder.jp/contests/abc051/tasks/abc051_d
- 提出: https://atcoder.jp/contests/abc051/submissions/39538106
- ある辺が最短経路になるかどうかは
a_i
とb_i
の最短経路がc_i
かどうかで判断できる (そうでないなら他の頂点経由でより短い経路がある) - すべての頂点の間の距離を求めて↑を確かめれば良い
- ワーシャルフロイド法か各頂点からダイクストラ法などで求められる
use proconio::{input, marker::Usize1};
fn adjacency_list(n: usize, uvw: &[(usize, usize, u64)]) -> Vec<Vec<(usize, u64)>> {
let mut e = vec![vec![]; n];
for (u, v, w) in uvw.iter().copied() {
e[u].push((v, w));
e[v].push((u, w));
}
e
}
fn dijkstra(n: usize, inf: u64, e: &[Vec<(usize, u64)>], s: usize) -> Vec<u64> {
use std::{cmp::Reverse, collections::BinaryHeap};
let mut d = vec![inf; n];
let mut pq = BinaryHeap::new();
d[s] = 0;
pq.push(Reverse((0, s)));
while let Some(Reverse((w_u, u))) = pq.pop() {
if w_u > d[u] {
continue;
}
for (v, w_v) in e[u].iter().copied() {
let w = w_u + w_v;
if w < d[v] {
d[v] = w;
pq.push(Reverse((w, v)));
}
}
}
d
}
fn main() {
input! {
n: usize,
m: usize,
abc: [(Usize1, Usize1, u64); m],
};
let edges = adjacency_list(n, &abc);
let inf = 1_u64 << 60;
let dist = (0..n)
.map(|u| dijkstra(n, inf, &edges, u))
.collect::<Vec<Vec<u64>>>();
let mut count = 0_usize;
for (a, b, c) in abc {
if dist[a][b] != c {
count += 1;
}
}
let ans = count;
println!("{}", ans);
}
今日のコミット。
- rust-sandbox 1 commit
- rust-atcoder 1 commit