ブログ名

競技プログラミングやお歌のお話をする高菜です。

Rust 1.77 で入った chunk 系機能を使うと(deque 系の) Convex Hull Trick が楽に書けます

愉快な仲間たち

使い方

last().is_some_or() などでやっていたようなことを、複数要素でもできますね!?

問題: C - スペースエクスプローラー高橋君

提出: https://atcoder.jp/contests/colopl2018-final/submissions/74666486

use proconio::input;

fn main() {
    input! {
        n: usize,
        a: [i64; n],
    }
    let mut lines = vec![];
    for (a2, b2) in a.iter().zip(0..).map(|(&a, i)| (-2 * i, i * i + a)) {
        while lines
            .last_chunk()
            .is_some_and(|&[(a0, b0), (a1, b1)]| (a1 - a0) * (b2 - b0) - (a2 - a0) * (b1 - b0) > 0)
        {
            lines.pop().unwrap();
        }
        lines.push((a2, b2));
    }
    let mut lines = &lines[..];
    for i in 0..n as i64 {
        while lines
            .first_chunk()
            .is_some_and(|&[(a0, b0), (a1, b1)]| a0 * i + b0 > a1 * i + b1)
        {
            lines = &lines[1..];
        }
        let &(x, y) = lines.first().unwrap();
        let ans = x * i + y + i * i;
        println!("{ans}");
    }
}