2021/01/02

AtCoder

  • AC数: 1380 -> 1386

ABC187

O(3^N)を求めるのを完全に忘れていた。典型というか自然にできるべき動作の一つだと思いますが……

atcoder.jp

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 とかを準備した方が良くて、まあ時間のある時にやります…という気持ちになった。