AtCoder Grand Contest 013 C - Ants on a Circle
解法
解説の通りにやった。Rustでは map を使って for を消せることを学んだ。
コード
use std::fmt::Debug; use std::io; use std::io::{Read, Stdin}; use std::str; use std::str::FromStr; use std::usize; use std::cmp; use std::collections::vec_deque::VecDeque; use std::i64::MAX; fn main() { let mut sc = Scanner::new(); let n = sc.parse::<usize>(); let l = sc.parse::<i64>(); let t = sc.parse::<i64>(); let mut x: Vec<i64> = vec![0; n]; let mut w: Vec<usize> = vec![0; n]; for i in 0..n { x[i] = sc.parse::<i64>(); w[i] = sc.parse::<usize>(); } let cross_count = (0..n) .map(|i| { let w0 = w[0]; let wi = w[i]; if w0 == wi { return 0; } let interval; if w0 == 1 { interval = x[i] - x[0]; } else { interval = x[0] + l - x[i]; } if interval > t * 2 { return 0; } let time = t * 2 - interval; let count; if time % l == 0 && w[0] == 1 { count = time / l; } else { count = time / l + 1; } return count; }) .collect::<Vec<i64>>(); let count_sum: i64 = cross_count.iter().sum::<i64>() % (n as i64); let position; let num; if w[0] == 1 { position = (x[0] + t) % l; num = count_sum; } else { position = (x[0] - (t % l) + l) % l; num = (n as i64) - count_sum; } let mut positions: Vec<i64> = (0..n) .map(|i| { let p; if w[i] == 1 { p = (x[i] + t) % l; } else { p = (x[i] - (t % l) + l) % l; } return p; }) .collect::<Vec<i64>>(); positions.sort(); let mut a = 0; for i in 0..n { if positions[i] == position { a = i; break; } } let ans = (0..n) .map(|idx| { let i = (idx + n - ((num as usize) % n)) % n; let p = (a + i as usize) % n; return positions[p]; }) .collect::<Vec<i64>>(); for a in &ans { println!("{}", a); } } struct Scanner { stdin: Stdin, buf: Vec<u8>, } impl Scanner { fn new() -> Scanner { Scanner { stdin: io::stdin(), buf: Vec::with_capacity(256), } } fn parse<T: FromStr>(&mut self) -> T where <T as FromStr>::Err: Debug { self.buf.clear(); let mut it = self.stdin.lock().bytes(); let mut c = it.next().unwrap().unwrap(); while c == ' ' as u8 || c == '\n' as u8 { c = it.next().unwrap().unwrap(); } while !(c == ' ' as u8 || c == '\n' as u8) { self.buf.push(c); c = it.next().unwrap().unwrap(); } str::from_utf8(&self.buf).unwrap().parse::<T>().unwrap() } }