Module c

Expand description

ยงABC 379 C - Sowing Stones

refs: https://atcoder.jp/contests/abc379/tasks/abc379_c

use std::collections::HashMap;

use proconio::input;

fn main() {
    input! {
        n: usize, m: usize,
        x: [usize; m],
        a: [usize; m],
    }

    let mut field = HashMap::new();
    for i in 0..m {
        *field.entry(x[i]).or_insert(0) += a[i];
    }
    field.entry(n).or_insert(0);

    let mut keys = field.keys().cloned().collect::<Vec<_>>();
    keys.sort();

    let mut buf = 0;
    let mut ans = 0;

    if keys[0] != 1 {
        println!("-1");
        return;
    }
    buf += field[&keys[0]] - 1;

    for i in 1..keys.len() {
        let diff = keys[i] - keys[i - 1] - 1;
        if buf < diff {
            println!("-1");
            return;
        }

        ans += sum_to_n(buf) - sum_to_n(buf - diff);

        buf -= diff;
        ans += buf;
        if field[&keys[i]] == 0 && buf == 0 {
            println!("-1");
            return;
        }

        buf += field[&keys[i]];
        buf -= 1;
    }

    if buf != 0 {
        println!("-1");
    } else {
        println!("{ans}");
    }
}

fn sum_to_n(n: usize) -> usize {
    n * (n + 1) / 2
}