atcoder-solutionsatcoder-solutions
abc359_e

Water Tank の解説

解説 by @ohnuma

解説

座圧して、セグ木で終わり!

fn main() { input! { n: usize, mut h: [usize; n] } h.push(0); let comp = CoordinateCompression::new(&h); let mut seg = Segtree::<Max<usize>>::new(n + 1); let mut ans = vec![0]; let mut a = vec![]; for i in 1..=n { let target = h[i - 1]; let id = comp.get(target).unwrap(); let pre = seg.prod(id..); let base = ans[pre]; let bonus = target * (i - pre); ans.push(base + bonus); a.push(base + bonus + 1); seg.set(id, i); } println!("{}" ,a.iter().join(" ")); }

コメント