結果
問題 | No.1730 GCD on Blackboard in yukicoder |
ユーザー | katand |
提出日時 | 2021-11-05 21:54:33 |
言語 | Rust (1.77.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 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1,051 ms
16,136 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 12 ms
9,728 KB |
testcase_03 | AC | 13 ms
9,728 KB |
testcase_04 | AC | 13 ms
9,600 KB |
testcase_05 | AC | 13 ms
9,728 KB |
testcase_06 | AC | 13 ms
9,600 KB |
testcase_07 | AC | 13 ms
9,728 KB |
testcase_08 | AC | 2 ms
5,248 KB |
testcase_09 | AC | 11 ms
7,552 KB |
testcase_10 | AC | 10 ms
7,552 KB |
testcase_11 | AC | 2 ms
5,248 KB |
testcase_12 | AC | 2 ms
5,248 KB |
testcase_13 | AC | 602 ms
22,204 KB |
testcase_14 | AC | 603 ms
22,204 KB |
testcase_15 | AC | 604 ms
22,332 KB |
testcase_16 | AC | 602 ms
22,200 KB |
testcase_17 | AC | 599 ms
22,208 KB |
testcase_18 | AC | 300 ms
15,936 KB |
testcase_19 | AC | 801 ms
19,264 KB |
testcase_20 | AC | 158 ms
18,468 KB |
testcase_21 | AC | 157 ms
18,596 KB |
testcase_22 | AC | 854 ms
14,780 KB |
testcase_23 | AC | 45 ms
14,392 KB |
testcase_24 | AC | 55 ms
20,580 KB |
testcase_25 | AC | 528 ms
17,336 KB |
ソースコード
/// 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 }