2024-02-14 ABC340 E
bouzuya/bbna の進捗はイマイチ。
blog.bouzuya.net の API の検証をしてみた。
articles か entries か posts かを数ヶ月に 1 回くらい調べている気がする。ぼくは次は entries にしよう。忘れるので宣言しておこう。
ABC340 : 鹿島建設プログラミングコンテスト2024(AtCoder Beginner Contest 340)
- E - Mancala 2
https://atcoder.jp/contests/abc340/tasks/abc340_e
- 提出: https://atcoder.jp/contests/abc340/submissions/50269719
- 区間加算・遅延セグメント木
A_{B_i}
がN
を超えている分は周回するのでA_{B_i} / N
をA
のすべての要素に足せばいい- 残りについては
B_i
の次の要素からA_{B_i} % N
個分に1
ずつ足せばいい - 遅延セグ木を素朴に使えれば解ける
use ac_library::{LazySegtree, MapMonoid, Monoid};
use proconio::input;
fn main() {
input! {
n: usize,
m: usize,
a: [usize; n],
b: [usize; m],
};
struct M(usize);
impl Monoid for M {
type S = usize;
fn identity() -> Self::S {
0_usize
}
fn binary_operation(a: &Self::S, b: &Self::S) -> Self::S {
a + b
}
}
#[derive(Clone, Copy, Debug)]
struct F(usize);
impl MapMonoid for F {
type M = M;
type F = F;
fn identity_map() -> Self::F {
F(0)
}
fn mapping(
f: &Self::F,
x: &<Self::M as ac_library::Monoid>::S,
) -> <Self::M as ac_library::Monoid>::S {
f.0 + x
}
fn composition(f: &Self::F, g: &Self::F) -> Self::F {
F(f.0 + g.0)
}
}
let mut lst = LazySegtree::<F>::new(n);
for (i, a_i) in a.iter().copied().enumerate() {
lst.set(i, a_i);
}
for b_i in b {
let v = lst.get(b_i);
lst.set(b_i, 0);
lst.apply_range(0..n, F(v / n));
let v = v % n;
if v > 0 {
if b_i == n - 1 {
lst.apply_range(0..v, F(1));
} else if b_i + 1 + v <= n {
lst.apply_range(b_i + 1..b_i + 1 + v, F(1));
} else {
lst.apply_range(b_i + 1..n, F(1));
lst.apply_range(0..(b_i + 1 + v) % n, F(1));
}
}
}
for i in 0..n {
let x = lst.get(i);
println!("{}", x);
}
}
今日のコミット。
- bbna 2 commits
- rust-atcoder 1 commit