2023-08-07 ABC061 A, B, C, D を解いた
耳鳴りしている……。
ABC061 : AtCoder Beginner Contest 061
- A - Between Two Integers
https://atcoder.jp/contests/abc061/tasks/abc061_a
- 提出: https://atcoder.jp/contests/abc061/submissions/44348129
(a..=b).contains(&c)
- B - Counting Roads
https://atcoder.jp/contests/abc061/tasks/abc061_b
- 提出: https://atcoder.jp/contests/abc061/submissions/44348141
- 隣接リストをつくってその個数を数えた
- リスト化しなくてもカウントだけで問題ない
- C - Big Array
https://atcoder.jp/contests/abc061/tasks/abc061_c
- 提出: https://atcoder.jp/contests/abc061/submissions/44348155
a
b
をa
ごとのb
の合計を入れたBTreeMap
に詰め替えるBTreeMap
を先頭から順に操作し、総和がK
以上になった時点でのa
が答えになる
- D - Score Attack
https://atcoder.jp/contests/abc061/tasks/abc061_d
- 提出: https://atcoder.jp/contests/abc061/submissions/44348287
- 有向グラフ (DAG) の最長経路
- 有向グラフの最長経路自体は辺の重みをマイナスにしてベルマンフォードで良い
- 落とし穴として 1 から N 以外の経路における閉路は無視して良いということ (4WA)
use proconio::{input, marker::Usize1};
fn bellman_ford(n: usize, inf: i64, edges: &[Vec<(usize, i64)>], start: usize) -> Option<Vec<i64>> {
let mut dist = vec![inf; n];
dist[start] = 0_i64;
for i in 0..n {
for (u, e_u) in edges.iter().enumerate() {
for (v, w) in e_u.iter().copied() {
if dist[u] + w < dist[v] {
dist[v] = dist[u] + w;
// v == n - 1 のみを対象で良い
if i == n - 1 && v == n - 1 {
return None;
}
}
}
}
}
Some(dist)
}
fn main() {
input! {
n: usize,
m: usize,
abc: [(Usize1, Usize1, i64); m],
};
let mut edges = vec![vec![]; n];
for (a, b, c) in abc {
edges[a].push((b, -c));
}
match bellman_ford(n, 1_i64 << 60, &edges, 0) {
None => println!("inf"),
Some(dist) => println!("{}", -dist[n - 1]),
}
}
今日のコミット。
- genpi 1 commit
- rust-atcoder 1 commit