summaryrefslogtreecommitdiff
path: root/kattis-kth-alginda-quicksort/src/main.rs
diff options
context:
space:
mode:
authormathiasmagnusson <mathiasmagnussons@gmail.com>2022-03-01 15:20:00 +0100
committermathiasmagnusson <mathiasmagnussons@gmail.com>2022-03-01 15:20:21 +0100
commit1d4ca5dea476889814fd365928c6eb0f68f1b9a4 (patch)
treed4fd18ad54510a152f4c97ef38e83b9959e48ccd /kattis-kth-alginda-quicksort/src/main.rs
parentd76ab9f13f60e9ca8a0e578d9cb209064a9a790d (diff)
downloadprogramming-problem-solving-1d4ca5dea476889814fd365928c6eb0f68f1b9a4.tar.gz
Hyper-optimize IO in rust solution
Diffstat (limited to 'kattis-kth-alginda-quicksort/src/main.rs')
-rw-r--r--kattis-kth-alginda-quicksort/src/main.rs70
1 files changed, 57 insertions, 13 deletions
diff --git a/kattis-kth-alginda-quicksort/src/main.rs b/kattis-kth-alginda-quicksort/src/main.rs
index 67646b3..afb23f7 100644
--- a/kattis-kth-alginda-quicksort/src/main.rs
+++ b/kattis-kth-alginda-quicksort/src/main.rs
@@ -2,27 +2,71 @@
#![feature(test)]
-use std::fmt::Write;
-use std::io::{stdin, Read};
+use std::io::{stdin, stdout, Read, Write};
mod radix_sort;
-
use radix_sort::radix_sort;
fn main() {
let mut buffer = String::new();
stdin().lock().read_to_string(&mut buffer).unwrap();
- let xs: Vec<i32> = buffer
- .split_ascii_whitespace()
- .skip(1)
- .map(|x| x.parse().unwrap())
- .collect();
+ let mut p = buffer.bytes();
+ let mut n = 0;
+ while let Some(b) = p.next() {
+ if b == b' ' {
+ break;
+ }
+ n *= 10;
+ n += (b - b'0') as usize;
+ }
+ let mut xs = vec![0; n];
+ for i in 0..n {
+ let mut neg = false;
+ let mut x = 0i32;
+ while let Some(b) = p.next() {
+ match b {
+ b' ' | b'\n' => break,
+ b'-' => neg = true,
+ b => {
+ x *= 10;
+ x += (b - b'0') as i32;
+ }
+ }
+ }
+ if neg {
+ x = -x;
+ }
+ xs[i] = x;
+ }
- let xs = radix_sort(xs);
+ radix_sort(&mut xs);
- buffer.clear();
- for x in xs {
- writeln!(buffer, "{}", x).unwrap();
+ let mut p = buffer.len() - 1;
+ let b = unsafe { buffer.as_mut_vec() };
+ b[p] = b'\n';
+ p -= 1;
+ for i in (0..n).rev() {
+ let x = xs[i];
+ let neg = x < 0;
+ let mut x = if neg { (-x) as u32 } else { x as u32 };
+ loop {
+ b[p] = (x % 10) as u8 + b'0';
+ p -= 1;
+ x /= 10;
+ if x == 0 {
+ break;
+ }
+ }
+ if neg {
+ b[p] = b'-';
+ p -= 1;
+ }
+ if i > 0 {
+ b[p] = b'\n';
+ p -= 1;
+ }
}
- print!("{}", buffer);
+ p += 1;
+
+ stdout().lock().write(&b[p..]).unwrap();
}