結果

問題 No.2465 Dilated Water Simulation
ユーザー 👑 Nachia
提出日時 2023-09-10 12:27:12
言語 Rust
(1.83.0 + proconio)
結果
WA  
実行時間 -
コード長 4,771 bytes
コンパイル時間 13,386 ms
コンパイル使用メモリ 384,372 KB
実行使用メモリ 15,448 KB
最終ジャッジ日時 2024-06-28 03:47:27
合計ジャッジ時間 18,200 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 19 WA * 6
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

fn solve(v : Vec<i64>, n : i64) -> Vec<i64> {
use std::cmp::min;
let mut v = v.clone();
let l = v.len();
let ncycles = n / (l as i64);
let mut gv : Vec<i64> = vec![v[0]; l];
for i in 1..l { gv[i] = min(gv[i-1], v[i]); }
let minv = gv[l-1];
for i in 0..l { v[i] -= minv; }
for i in 0..l { gv[i] -= minv; }
let mut height_length = vec![(0i64, 0i64); 0];
let mut imos1 = vec![0i64; l+1];
let mut imos0 = vec![0i64; l];
let mask = (1i64 << 30) - 1;
let mut contribute = | pos : usize, t : i64, weight : i64 | {
if t + (pos as i64) <= ncycles {
imos0[pos] += weight * (ncycles - t);
imos0[pos] &= mask;
imos1[pos] -= weight;
imos1[pos] &= mask;
}
else if t <= ncycles {
let decrease_len = (ncycles - t) as usize;
imos0[pos] += weight * (ncycles - t);
imos0[pos] &= mask;
imos1[pos] -= weight;
imos1[pos] &= mask;
imos1[pos - decrease_len] += weight;
imos1[pos - decrease_len] &= mask;
}
};
for i in (0..l).rev() {
if gv[i] == 0 { continue; }
let mut rem = v[i];
let mut turn = 1i64;
while !height_length.is_empty() && rem >= gv[i] {
let (h, len) = height_length.pop().unwrap();
contribute(i, turn, -h);
contribute(i, turn + len, h);
if len == 0 { continue; }
if h == gv[i] {
turn += len;
continue;
}
let hturn = (rem - gv[i]) / (gv[i] - h) + 1;
if hturn >= len {
turn += len;
rem -= len * (gv[i] - h);
}
else {
turn += hturn;
rem -= hturn * (gv[i] - h);
contribute(i, turn + hturn, h);
contribute(i, turn + len, -h);
height_length.push((h, len - hturn));
break;
}
}
turn += rem / gv[i];
rem %= gv[i];
contribute(i, turn - 1, rem);
contribute(i, turn, -rem);
height_length.push((rem, 1));
turn -= 1;
contribute(i, 0, gv[i]);
contribute(i, turn, -gv[i]);
height_length.push((gv[i], turn));
}
for i in (0..l).rev() { imos1[i] = (imos1[i] + imos1[i+1]) & mask; }
for i in 0..l { imos0[i] = (imos0[i] + imos1[i+1]) & mask; }
imos0[0] = v[0];
let mut ans = vec![0i64; l];
let mut rem = v[0];
for i in (0..l).rev() {
let x = min(imos0[i], rem);
rem -= x;
ans[i] = x;
}
ans[0] += minv;
for i in 0..((n % (l as i64)) as usize) {
let f = min(ans[i], v[i+1] + minv - ans[i+1]);
ans[i] -= f;
ans[i+1] += f;
}
ans
}
fn main(){
let mut cin = StdIStr::new();
let n : usize = cin.get();
let v : Vec<i64> = cin.vec(n);
let m : i64 = cin.get();
let w = solve(v, m);
use std::io::Write;
let out = std::io::stdout();
let mut out = std::io::BufWriter::new(out.lock());
writeln!(out, "{}", w.iter().map(std::string::ToString::to_string).collect::<Vec<_>>().join(" ")).unwrap();
}
pub trait IStr {
fn sc(&mut self) -> u8;
fn gc(&mut self) -> u8;
fn end(&mut self) -> bool;
fn skipwc(&mut self){ while self.sc() <= (' ' as u8) { self.gc(); } }
}
pub trait FromIStr<T> { fn rd<Str : IStr>(s : &mut Str) -> T; }
macro_rules! impl_uint_from_istr {
($t:ty) => {
impl FromIStr<$t> for $t {
fn rd<Str : IStr>(s : &mut Str) -> $t {
s.skipwc();
let mut x = 0 as $t;
while ('0' as u8) <= s.sc() { x = x*10 + (s.gc() - '0' as u8) as $t; }
x
}
}
};
}
impl_uint_from_istr!(i64);
impl_uint_from_istr!(usize);
struct StdIStr { buf : [u8; 65536], idx : usize, fil : usize, eof : bool }
impl IStr for StdIStr {
fn sc(&mut self) -> u8 { if self.eof { 0u8 } else { self.buf[self.idx] } }
fn gc(&mut self) -> u8 {
let res = self.sc(); self.idx += 1;
if self.idx == self.fil { self.proc(); }
res
}
fn end(&mut self) -> bool { self.eof }
}
impl StdIStr {
fn proc(&mut self) {
use std::io::Read;
self.fil = std::io::stdin().read(&mut self.buf).unwrap();
self.eof = self.fil == 0;
self.idx = 0;
if self.eof { self.buf[0] = 0u8; }
}
pub fn new() -> StdIStr {
let mut res = StdIStr{ buf : [0u8; 65536], idx : 0, fil : 0, eof : false };
res.proc();
res
}
pub fn get<T : FromIStr<T>>(&mut self) -> T { T::rd(self) }
pub fn vec<T : FromIStr<T>>(&mut self, n : usize) -> Vec<T> {
let mut r = Vec::<T>::new();
r.reserve(n);
for _ in 0..n { r.push(self.get()); }
r
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0