use std::io;
use std::io::Write;
use std::str;
use std::cmp::{max,min};
/// https://github.com/EbTech/rust-algorithms/blob/master/src/scanner.rs
pub struct Scanner<R> {
reader: R,
buffer: Vec<String>,
}
impl<R: io::BufRead> Scanner<R> {
pub fn new(reader: R) -> Self {
Self {
reader,
buffer: vec![],
}
}
pub fn token<T: str::FromStr>(&mut self) -> T {
loop {
if let Some(token) = self.buffer.pop() {
return token.parse().ok().expect("Failed parse");
}
let mut input = String::new();
self.reader.read_line(&mut input).expect("Failed read");
self.buffer = input.split_whitespace().rev().map(String::from).collect();
}
}
}
fn main() {
let mut scan = Scanner::new(io::stdin().lock());
let n = scan.token::<usize>();
let k = scan.token::<i64>();
let tab: Vec<i64> = (0..n).map(|_| scan.token()).collect();
let mut copy = tab.clone();
let mut sorted = tab.iter().cloned().enumerate().collect::<Vec<_>>();
sorted.sort_by_key(|x| -x.1);
for (i, _) in sorted {
for j in i+1..n {
copy[j] = max(copy[j], copy[j-1]-k);
}
for j in (0..i).rev() {
copy[j] = max(copy[j], copy[j+1]-k);
}
}
println!("{}", tab.into_iter().zip(copy).map(|(a,b)| b-a).sum::<i64>());
}
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 | use std::io; use std::io::Write; use std::str; use std::cmp::{max,min}; /// https://github.com/EbTech/rust-algorithms/blob/master/src/scanner.rs pub struct Scanner<R> { reader: R, buffer: Vec<String>, } impl<R: io::BufRead> Scanner<R> { pub fn new(reader: R) -> Self { Self { reader, buffer: vec![], } } pub fn token<T: str::FromStr>(&mut self) -> T { loop { if let Some(token) = self.buffer.pop() { return token.parse().ok().expect("Failed parse"); } let mut input = String::new(); self.reader.read_line(&mut input).expect("Failed read"); self.buffer = input.split_whitespace().rev().map(String::from).collect(); } } } fn main() { let mut scan = Scanner::new(io::stdin().lock()); let n = scan.token::<usize>(); let k = scan.token::<i64>(); let tab: Vec<i64> = (0..n).map(|_| scan.token()).collect(); let mut copy = tab.clone(); let mut sorted = tab.iter().cloned().enumerate().collect::<Vec<_>>(); sorted.sort_by_key(|x| -x.1); for (i, _) in sorted { for j in i+1..n { copy[j] = max(copy[j], copy[j-1]-k); } for j in (0..i).rev() { copy[j] = max(copy[j], copy[j+1]-k); } } println!("{}", tab.into_iter().zip(copy).map(|(a,b)| b-a).sum::<i64>()); } |
English