use std::cmp::max;
macro_rules! input {
(source = $s:expr, $($r:tt)*) => {
let mut iter = $s.split_whitespace();
input_inner!{iter, $($r)*}
};
($($r:tt)*) => {
let s = {
use std::io::Read;
let mut s = String::new();
std::io::stdin().read_to_string(&mut s).unwrap();
s
};
let mut iter = s.split_whitespace();
input_inner!{iter, $($r)*}
};
}
macro_rules! input_inner {
($iter:expr) => {};
($iter:expr, ) => {};
($iter:expr, $var:ident : $t:tt $($r:tt)*) => {
let $var = read_value!($iter, $t);
input_inner!{$iter $($r)*}
};
}
macro_rules! read_value {
($iter:expr, ( $($t:tt),* )) => {
( $(read_value!($iter, $t)),* )
};
($iter:expr, [ $t:tt ; $len:expr ]) => {
(0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>()
};
($iter:expr, chars) => {
read_value!($iter, String).chars().collect::<Vec<char>>()
};
($iter:expr, usize1) => {
read_value!($iter, usize) - 1
};
($iter:expr, $t:ty) => {
$iter.next().unwrap().parse::<$t>().expect("Parse error")
};
}
fn get_amount_of_gravel(height: i64, target: i64, k: i64) -> i64 {
max(target - k - height, 0)
}
fn main() {
input! {
n: usize,
k: i64,
a: [i64; n],
}
let mut a = a;
let mut result = 0;
if n == 1 {
println!("0");
return;
}
// eprintln!("{:?}", a);
for i in 1..n {
let required_gravel = get_amount_of_gravel(a[i], a[i - 1], k);
result += required_gravel;
a[i] += required_gravel;
}
// eprintln!("{:?}", a);
for i in (0..=(n - 2)).rev() {
let required_gravel = get_amount_of_gravel(a[i], a[i + 1], k);
// eprintln!("{} {}", a[i], a[i+1]);
result += required_gravel;
a[i] += required_gravel;
}
// eprintln!("{:?}", a);
println!("{}", result);
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | use std::cmp::max; macro_rules! input { (source = $s:expr, $($r:tt)*) => { let mut iter = $s.split_whitespace(); input_inner!{iter, $($r)*} }; ($($r:tt)*) => { let s = { use std::io::Read; let mut s = String::new(); std::io::stdin().read_to_string(&mut s).unwrap(); s }; let mut iter = s.split_whitespace(); input_inner!{iter, $($r)*} }; } macro_rules! input_inner { ($iter:expr) => {}; ($iter:expr, ) => {}; ($iter:expr, $var:ident : $t:tt $($r:tt)*) => { let $var = read_value!($iter, $t); input_inner!{$iter $($r)*} }; } macro_rules! read_value { ($iter:expr, ( $($t:tt),* )) => { ( $(read_value!($iter, $t)),* ) }; ($iter:expr, [ $t:tt ; $len:expr ]) => { (0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>() }; ($iter:expr, chars) => { read_value!($iter, String).chars().collect::<Vec<char>>() }; ($iter:expr, usize1) => { read_value!($iter, usize) - 1 }; ($iter:expr, $t:ty) => { $iter.next().unwrap().parse::<$t>().expect("Parse error") }; } fn get_amount_of_gravel(height: i64, target: i64, k: i64) -> i64 { max(target - k - height, 0) } fn main() { input! { n: usize, k: i64, a: [i64; n], } let mut a = a; let mut result = 0; if n == 1 { println!("0"); return; } // eprintln!("{:?}", a); for i in 1..n { let required_gravel = get_amount_of_gravel(a[i], a[i - 1], k); result += required_gravel; a[i] += required_gravel; } // eprintln!("{:?}", a); for i in (0..=(n - 2)).rev() { let required_gravel = get_amount_of_gravel(a[i], a[i + 1], k); // eprintln!("{} {}", a[i], a[i+1]); result += required_gravel; a[i] += required_gravel; } // eprintln!("{:?}", a); println!("{}", result); } |
English