2023-07-18 リングフィットアドベンチャーの再開 / ABC151 A, B, C, D, E を解いた
昨日からリングフィットアドベンチャーを再開している。フィットボクシング 2 よりも負荷が高い。
頭が痛いので寝る。
ABC151 : AtCoder Beginner Contest 151
- A - Next Alphabet
https://atcoder.jp/contests/abc151/tasks/abc151_a
- 提出: https://atcoder.jp/contests/abc151/submissions/43704873
(c as u8 + 1) as char
- B - Achieve the Goal
https://atcoder.jp/contests/abc151/tasks/abc151_b
- 提出: https://atcoder.jp/contests/abc151/submissions/43704903
SUM(A)
を先にとっておき0..=K
の値を足したときにM * N
以上になるかを調べれば良い- 除算は誤差が怖いので両辺に
N
を掛けている
- C - Welcome to AtCoder
https://atcoder.jp/contests/abc151/tasks/abc151_c
- 提出: https://atcoder.jp/contests/abc151/submissions/43704957
AC
かどうかとWA
のカウントをとれば良いAC
後にインクリメントしないとか、AC
していないWA
を無視するなどの考慮を忘れずに
- D - Maze Master
https://atcoder.jp/contests/abc151/tasks/abc151_d
- 提出: https://atcoder.jp/contests/abc151/submissions/43705077
- 適当なところからスタートして BFS で最も距離の遠い場所を求める
- 最も距離の遠いところから再度 BFS で最も距離の遠い場所を求めるとそれが答えになる (はず)
- 木の最短距離を求めるときと同じ要領で
- 嘘解法っぽいけど通っている
- E - Max-Min Sums
https://atcoder.jp/contests/abc151/tasks/abc151_e
- 提出: https://atcoder.jp/contests/abc151/submissions/43706106
- 解説 AC
- もうすこし時間をかければ解けそう
- SUM(MAX(X)) と SUM(MIN(X)) を分けて考える
- X の個数は、 A をソートしていれば A_i を MAX とする個数を i, k - 1 の二項係数で求められる、それに A_i をかければ SUM になる
- 同様に MIN を求められる
- 同じ値のときも特別な考慮なしに求められる
- F - Enclose All
https://atcoder.jp/contests/abc151/tasks/abc151_f
- 時間が足りず、未着手
use modint::ModInt1000000007 as ModInt;
use proconio::input;
fn main() {
input! {
n: usize,
k: usize,
mut a: [i64; n],
};
let (fact, finv) = {
let maxn = n;
let mut fact = vec![ModInt::new(1); maxn + 1];
for i in 1..=maxn {
fact[i] = fact[i - 1] * ModInt::new(i);
}
let mut finv = vec![ModInt::new(1); maxn + 1];
finv[maxn] = fact[maxn].inv();
for i in (1..=maxn).rev() {
finv[i - 1] = finv[i] * ModInt::new(i);
}
(fact, finv)
};
let binom = |n: usize, k: usize| -> ModInt {
if n < k {
ModInt::new(0)
} else {
fact[n] * finv[k] * finv[n - k]
}
};
let mut ans = ModInt::new(0);
a.sort();
for (i, a_i) in a.iter().copied().enumerate() {
ans += binom(i, k - 1) * a_i;
}
a.reverse();
for (i, a_i) in a.iter().copied().enumerate() {
ans -= binom(i, k - 1) * a_i;
}
println!("{}", ans);
}
// modint
今日のコミット。