2023-10-02 体調不良 / PAST#4 O
体調が悪くて仕事を休んでいた。季節の変わり目で気温が下がったからだろうか……。風邪っぽい状態。
ぼんやり横になっていて昔はもうすこし身の回りのことを書いていたのだけどこの頃はあまり書いていないなと思った。
先日『メメント』をひさびさに見た。 Event Sourcing 的な観点から「イベントは漏れなく記録されないといけない」や「イベントは不変でなくてはいけない」などに注意しないといけないと思った。
- 宝箱 (第四回 アルゴリズム実技検定:O問題)
https://atcoder.jp/contests/past202010-open/tasks/past202010_o
- 提出: https://atcoder.jp/contests/past202010-open/submissions/46162848
- 解説 AC
- 式を整理したあと整理すると 2 パターンのセグ木で扱えることが分かる
- まだ自力で解ける気がしない
use proconio::input;
use segtree::*;
fn main() {
input! {
n: usize,
m: usize,
a: [i64; n],
mut lrc: [(usize, usize, i64); m],
}
let s = std::iter::once(0)
.chain(a.iter().scan(0, |acc, &i| {
*acc += i;
Some(*acc)
}))
.collect::<Vec<i64>>();
lrc.sort_by_key(|&(_, r, _)| r);
let mut seg0 = Segtree::<Max<i64>>::new(n + 1);
for i in 0..n {
seg0.set(i, 0);
}
let mut seg1 = Segtree::<Max<i64>>::new(n + 1);
for (i, s_i) in s.iter().copied().enumerate() {
seg1.set(i, -s_i);
}
for (l, r, c) in lrc {
let v0 = seg0.prod(0..l) + s[r] - s[l - 1] - c;
let v1 = seg1.prod(l - 1..r) + s[r] - c;
let v = v0.max(v1);
seg0.set(r, seg0.get(r).max(v));
seg1.set(r, seg1.get(r).max(v - s[r]));
}
let ans = seg0.prod(0..=n);
println!("{}", ans);
}
// segtree
今日のコミット。
- rust-atcoder 1 commit
- kireta 1 commit