2021/01/02
AtCoder
- AC数: 1380 -> 1386
ABC187
O(3^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 m: usize = sc.read(); let mut graph = vec![0; n]; for _ in 0..m { let a = sc.usize0(); let b = sc.usize0(); graph[a] |= 1 << b; graph[b] |= 1 << a; } let mut dp = vec![n; 1 << n]; dp[0] = 1; for i in 0..n { for mask in 0..(1 << n) { if dp[mask] == 1 && (graph[i] & mask) == mask { dp[mask | (1 << i)] = 1; } } } for mask in 1..(1 << n) { let mut half = mask; while half > 0 { assert_eq!(mask & half, half); dp[mask] = dp[mask].min(dp[mask ^ half] + dp[half]); half -= 1; half &= mask; } } println!("{}", dp[(1 << n) - 1]); } 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) -> Self { Self(r, std::io::BufWriter::new(w)) } pub fn write<S: ToString>(&mut self, s: S) { use std::io::Write; self.1.write_all(s.to_string().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 usize0(&mut self) -> usize { self.read::<usize>() - 1 } 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() } }
AtCoder Problems
本当はバチャの結果をキャッシュしたほうが良くて、もう1年前くらいから考えていたが、いかんせん時間がないのと、直ちに危険な状況ではないため放置していた結果、年末年始の大型バチャラッシュで無事死亡と相成った(いい話)。とりあえず小手先でDBサーバーのストレージを gp3 にして IOPS を指定みたけど、どうなることやら…
キャッシュはやるとしたら Redis でやりたいと考えているが、その場合 ElasiCache とかを準備した方が良くて、まあ時間のある時にやります…という気持ちになった。