結果

問題 No.1730 GCD on Blackboard in yukicoder
ユーザー katand
提出日時 2021-11-05 21:54:33
言語 Rust
(1.83.0 + proconio)
結果
AC  
実行時間 1,051 ms / 2,000 ms
コード長 5,616 bytes
コンパイル時間 13,376 ms
コンパイル使用メモリ 378,896 KB
実行使用メモリ 22,332 KB
最終ジャッジ日時 2024-11-08 04:37:00
合計ジャッジ時間 23,460 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 24
権限があれば一括ダウンロードができます

ソースコード

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

/// general import
pub use std::{
cmp::{max, min, Ordering, Reverse},
collections::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, VecDeque},
convert::Infallible,
convert::{TryFrom, TryInto},
fmt::{Debug, Display, Formatter},
io::{stdin, stdout, BufRead, BufWriter, Write},
iter::{Product, Sum},
marker::PhantomData,
mem::swap,
ops::{
Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Bound,
Deref, DerefMut, Div, DivAssign, Mul, MulAssign, Neg, Not, RangeBounds, Rem, RemAssign,
Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign,
},
str::{from_utf8, FromStr},
};
/// min-max macros
#[allow(unused_macros)]
macro_rules! chmin {($base:expr, $($cmps:expr),+ $(,)*) => {{let cmp_min = min!($($cmps),+);if $base > cmp_min {$base = cmp_min;true} else {false}}}
    ;}
#[allow(unused_macros)]
macro_rules! chmax {($base:expr, $($cmps:expr),+ $(,)*) => {{let cmp_max = max!($($cmps),+);if $base < cmp_max {$base = cmp_max;true} else {false}}}
    ;}
#[allow(unused_macros)]
macro_rules! min {($a:expr $(,)*) => {{$a}};($a:expr, $b:expr $(,)*) => {{if $a > $b {$b} else {$a}}};($a:expr, $($rest:expr),+ $(,)*) => {{let b =
    min!($($rest),+);if $a > b {b} else {$a}}};}
#[allow(unused_macros)]
macro_rules! max {($a:expr $(,)*) => {{$a}};($a:expr, $b:expr $(,)*) => {{if $a > $b {$a} else {$b}}};($a:expr, $($rest:expr),+ $(,)*) => {{let b =
    max!($($rest),+);if $a > b {$a} else {b}}};}
pub fn to_lr<R: RangeBounds<usize>>(range: &R, length: usize) -> (usize, usize) {
let l = match range.start_bound() {
Bound::Unbounded => 0,
Bound::Included(&s) => s,
Bound::Excluded(&s) => s + 1,
};
let r = match range.end_bound() {
Bound::Unbounded => length,
Bound::Included(&e) => e + 1,
Bound::Excluded(&e) => e,
};
assert!(l <= r && r <= length);
(l, r)
}
/// stdin reader
pub struct Reader<R> {
reader: R,
buf: VecDeque<String>,
}
impl<R: BufRead> Iterator for Reader<R> {
type Item = String;
fn next(&mut self) -> Option<String> {
if self.buf.is_empty() {
let mut buf = Vec::new();
self.reader.read_to_end(&mut buf).unwrap();
let s = from_utf8(&buf).expect("utf8.");
s.split_whitespace()
.map(ToString::to_string)
.for_each(|s| self.buf.push_back(s));
}
self.buf.pop_front()
}
}
impl<R: BufRead> Reader<R> {
pub fn new(reader: R) -> Reader<R> {
Reader {
reader,
buf: VecDeque::new(),
}
}
pub fn val<T: FromStr>(&mut self) -> T {
self.next()
.map(|token| token.parse().ok().expect(""))
.expect("")
}
pub fn vec<T: FromStr>(&mut self, length: usize) -> Vec<T> {
(0..length).map(|_| self.val()).collect()
}
pub fn chars(&mut self) -> Vec<char> {
self.val::<String>().chars().collect()
}
pub fn digits(&mut self) -> Vec<i64> {
self.val::<String>()
.chars()
.map(|c| (c as u8 - b'0') as i64)
.collect()
}
pub fn char_map(&mut self, h: usize) -> Vec<Vec<char>> {
(0..h).map(|_| self.chars()).collect()
}
pub fn bool_map(&mut self, h: usize, ng: char) -> Vec<Vec<bool>> {
self.char_map(h)
.iter()
.map(|v| v.iter().map(|&c| c != ng).collect())
.collect()
}
pub fn matrix<T: FromStr>(&mut self, h: usize, w: usize) -> Vec<Vec<T>> {
(0..h).map(|_| self.vec(w)).collect()
}
}
/// stdin writer
pub struct Writer<W: Write> {
writer: BufWriter<W>,
}
impl<W: Write> Writer<W> {
pub fn new(write: W) -> Self {
Self {
writer: BufWriter::new(write),
}
}
pub fn println<S: Display>(&mut self, s: S) {
writeln!(self.writer, "{}", s).expect("Failed to write.")
}
pub fn print<S: Display>(&mut self, s: S) {
write!(self.writer, "{}", s).expect("Failed to write.")
}
pub fn print_join<S: Display>(&mut self, v: &[S], separator: &str) {
v.iter().fold("", |sep, arg| {
write!(self.writer, "{}{}", sep, arg).expect("Failed to write.");
separator
});
writeln!(self.writer).expect("Failed to write.");
}
}
#[allow(dead_code)]
fn main() {
let stdin = stdin();
let stdout = stdout();
solve(Reader::new(stdin.lock()), Writer::new(stdout.lock()));
}
pub fn solve<R: BufRead, W: Write>(mut reader: Reader<R>, mut writer: Writer<W>) {
let n = reader.val::<usize>();
let a = reader.vec::<i64>(n);
const MAX: usize = 1000010;
let mut counts = vec![0; MAX];
for ai in a {
let mut l = 1;
while l * l <= ai {
if ai % l == 0 {
counts[l as usize] += 1;
if ai / l != l {
counts[(ai / l) as usize] += 1;
}
}
l += 1;
}
}
for i in (1..MAX).rev() {
chmax!(counts[i - 1], counts[i]);
}
let mut ans = vec![0; n + 1];
for i in 1..=n {
ans[n - i] = binary_search(-1, MAX as i64 + 1, |mid| counts[mid as usize] >= i);
}
writer.print_join(&ans[0..n], "\n");
}
pub fn binary_search<F: Fn(i64) -> bool>(mut ok: i64, mut ng: i64, f: F) -> i64 {
while (ok - ng).abs() > 1 {
let mid = (ok + ng) / 2;
if f(mid) {
ok = mid
} else {
ng = mid
}
}
ok
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0