第二回全国統一プログラミング王決定戦予選 E - Non-triangular Triplets
解法
とりあえず 2N ... 3N-1 は c に割り当てる。
というようにできるとよい。ここで、 としたいが、これだけでN要素は作れないので、前半と後半に分けて別々に構築する。
コード
fn main() { let (r, w) = (std::io::stdin(), std::io::stdout()); let mut sc = IO::new(r.lock(), w.lock()); let n: usize = sc.read(); let k: usize = sc.read(); let prefix = (n + 1) / 2; let suffix = n / 2; let mut a = vec![0; n]; let mut b = vec![0; n]; for i in 0..prefix { a[prefix - 1 - i] = k + i; } for i in 0..suffix { a[n - 1 - i] = k + i + prefix; } for i in 0..prefix { b[i] = k + n + i * 2; } for i in 0..suffix { b[i + prefix] = k + n + i * 2 + 1; } let mut ans = vec![]; for i in 0..n { let a = a[i]; let b = b[i]; let c = k + n * 2 + i; if a + b <= c { ans.push((a, b, c)); } else { println!("-1"); return; } } for (a, b, c) in ans.into_iter() { sc.write(format!("{} {} {}\n", a, b, c)); } } pub struct IO<R, W: std::io::Write>(R, std::io::BufWriter<W>); impl<R: std::io::Read, W: std::io::Write> IO<R, W> { pub fn new(r: R, w: W) -> IO<R, W> { IO(r, std::io::BufWriter::new(w)) } pub fn write<S: std::ops::Deref<Target = str>>(&mut self, s: S) { use std::io::Write; self.1.write(s.as_bytes()).unwrap(); } pub fn read<T: std::str::FromStr>(&mut self) -> T { use std::io::Read; let buf = self .0 .by_ref() .bytes() .map(|b| b.unwrap()) .skip_while(|&b| b == b' ' || b == b'\n' || b == b'\r' || b == b'\t') .take_while(|&b| b != b' ' && b != b'\n' && b != b'\r' && b != b'\t') .collect::<Vec<_>>(); unsafe { std::str::from_utf8_unchecked(&buf) } .parse() .ok() .expect("Parse error.") } pub fn vec<T: std::str::FromStr>(&mut self, n: usize) -> Vec<T> { (0..n).map(|_| self.read()).collect() } pub fn chars(&mut self) -> Vec<char> { self.read::<String>().chars().collect() } }