From ff072b2e89d914a299459f9b13b6f75b48557c2e Mon Sep 17 00:00:00 2001 From: bouzuya Date: Tue, 5 Mar 2024 22:10:56 +0900 Subject: [PATCH] past16-open i --- .../contests/past16-open/src/bin/i.rs | 55 +++++++++++++++++-- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/cargo-atcoder-1.70.0/contests/past16-open/src/bin/i.rs b/cargo-atcoder-1.70.0/contests/past16-open/src/bin/i.rs index 2a9506c8..93e52164 100644 --- a/cargo-atcoder-1.70.0/contests/past16-open/src/bin/i.rs +++ b/cargo-atcoder-1.70.0/contests/past16-open/src/bin/i.rs @@ -1,10 +1,57 @@ -use proconio::{input, marker::Usize1}; +use std::{cmp::Reverse, collections::BinaryHeap}; + +use proconio::input; fn main() { input! { n: usize, - a: [Usize1; n], + m: usize, + k: usize, + a: [usize; n], }; - let ans = n - a.len(); - println!("{}", ans); + let mut ok = 0_usize; + let mut ng = 1 << 60; + while ng - ok > 1 { + let mid = (ok + ng) / 2; + let mut sum = 0_usize; + for a_i in a.iter().copied() { + if a_i < mid { + sum += (mid - a_i + k - 1) / k; + } + } + if sum <= m { + ok = mid; + } else { + ng = mid; + } + } + + let min = ok; + let mut count = 0_usize; + let mut b = a.clone(); + for b_i in b.iter_mut() { + if *b_i < min { + let c = (min - *b_i + k - 1) / k; + count += c; + *b_i += c * k; + } + } + + let mut pq = BinaryHeap::new(); + for (i, b_i) in b.iter().copied().enumerate() { + pq.push(Reverse((b_i, i))); + } + + for _ in 0..m - count { + let Reverse((b_i, i)) = pq.pop().unwrap(); + pq.push(Reverse((b_i + k, i))); + } + + let mut ans = vec![0; n]; + for Reverse((b_i, i)) in pq { + ans[i] = b_i; + } + for a in ans { + println!("{}", a); + } }