bouzuya.hatenablog.com

ぼうずやのにっき

疲れた / 競プロ典型 90 問 004

下の子の生活発表会や緊張するようなイベントがあって疲れた。

下の子は泣いてろくに動かなかった。会の衣装を見ると、なぜ赤が最近のお気に入りなのかわかった。


競プロ典型 90 問

use proconio::input;

fn main() {
    input! {
        h: usize,
        w: usize,
        a: [[usize; w]; h],
    };
    let rows = a
        .iter()
        .map(|r| r.iter().sum::<usize>())
        .collect::<Vec<usize>>();
    let cols = (0..w)
        .map(|j| (0..h).map(|i| a[i][j]).sum::<usize>())
        .collect::<Vec<usize>>();
    for i in 0..h {
        for j in 0..w {
            let ans = rows[i] + cols[j] - a[i][j];
            print!("{}{}", ans, if j == w - 1 { "\n" } else { " " });
        }
    }
}

今日のコミット。

つらい / typical90 003

天気が悪いせいかなんとなくつらい。


競プロ典型 90 問

use std::collections::VecDeque;

use proconio::{input, marker::Usize1};

fn f(edges: &[Vec<usize>], start: usize) -> Vec<usize> {
    let inf = 1_usize << 60;
    let mut dist = vec![inf; edges.len()];
    let mut deque = VecDeque::new();
    dist[start] = 0_usize;
    deque.push_back(start);
    while let Some(u) = deque.pop_front() {
        for v in edges[u].iter().copied() {
            if dist[v] != inf {
                continue;
            }
            dist[v] = dist[u] + 1;
            deque.push_back(v);
        }
    }
    dist
}

fn main() {
    input! {
        n: usize,
        ab: [(Usize1, Usize1); n - 1],
    };
    let mut edges = vec![vec![]; n];
    for (a, b) in ab {
        edges[a].push(b);
        edges[b].push(a);
    }

    let dist = f(&edges, 0);

    let mut max = (0, 0);
    for (i, d) in dist.iter().copied().enumerate() {
        if d > max.1 {
            max = (i, d);
        }
    }

    let dist = f(&edges, max.0);
    let max = dist.iter().max().unwrap();

    let ans = max + 1;
    println!("{}", ans);
}

今日のコミット。

下の子がウェイクワードを使う / 競プロ典型 90 問 002

先週末くらいからだけど下の子が Google Home のウェイクワードを使えるようになっている。リスク。


競プロ典型 90 問

use std::collections::BTreeSet;

use proconio::input;

fn main() {
    input! {
        n: usize,
    };
    let mut ans = BTreeSet::new();
    for bits in 0..1 << n {
        let cs = (0..n)
            .map(|i| if ((bits >> i) & 1) == 1 { ')' } else { '(' })
            .collect::<Vec<char>>();
        let mut ok = true;
        let mut stack = vec![];
        for c in cs.iter().copied() {
            match c {
                '(' => stack.push(c),
                ')' => match stack.pop() {
                    None => {
                        ok = false;
                        break;
                    }
                    Some(p) => {
                        if p != '(' {
                            ok = false;
                            break;
                        }
                    }
                },
                _ => unreachable!(),
            }
        }
        ok &= stack.is_empty();
        if ok {
            ans.insert(cs.into_iter().collect::<String>());
        }
    }
    for a in ans {
        println!("{}", a);
    }
}

今日のコミット。

典型90問 1 問目からハマる

典型90問 1 問目からハマってしまった……。


今日のコミット。

2024-W07 ふりかえり

2024-W07 をふりかえる。

2024-W07 の目標 とその記事

目標。

  • ☐ bbna を一段落させる

記事。

つくったもの。

育児。

  • 上の子の歯が抜けた
  • 下の子はポップコーンをポコポンと呼ぶ (2024-02-12)

2024-W07 はどうだったか。

ABC341 に参加した。 1325 → 1314 (-11) 。 https://atcoder.jp/users/bouzuya/history/share/abc341 。今回は解けたはずの D 問題を解けず。最近は問題を解く量も減っているし、出るたびに下げている。

子どもの髪型を坊主にした。上の子の歯が抜けた。

ブラーバのタイヤを替えた。

GitHub Copilot とのペアプロ TDD でつくるローグライク RPG 』を読んでいる。試している。

2024-W08 の目標

しがみついてくる

この頃は子どもがしがみついてくる。背中に首に脚に。椅子に座っていれば背中と背もたれの間に入ってくる。


ABC341 。参加するたびに下げている気がする。


今日のコミット。

子どもの髪型を坊主にした / PAST #4 G

子どもの髪型を坊主にした。


PAST #4 第四回 アルゴリズム実技検定 過去問

use std::collections::VecDeque;

use proconio::{input, marker::Chars};

fn ok(n: usize, m: usize, s: &[Vec<char>]) -> bool {
    let mut count = 0_usize;
    let mut visited = vec![vec![false; m]; n];
    for i in 0..n {
        for j in 0..m {
            if s[i][j] == '#' || visited[i][j] {
                continue;
            }

            count += 1;
            let mut deque = VecDeque::new();
            visited[i][j] = true;
            deque.push_back((i, j));
            while let Some((r, c)) = deque.pop_front() {
                let dir = vec![(-1, 0), (0, -1), (0, 1), (1, 0)];
                for (dr, dc) in dir {
                    let (nr, nc) = (r as i64 + dr, c as i64 + dc);
                    if !(0..n as i64).contains(&nr) || !(0..m as i64).contains(&nc) {
                        continue;
                    }
                    let (nr, nc) = (nr as usize, nc as usize);
                    if s[nr][nc] == '#' {
                        continue;
                    }
                    if visited[nr][nc] {
                        continue;
                    }
                    visited[nr][nc] = true;
                    deque.push_back((nr, nc));
                }
            }
        }
    }
    count == 1
}

fn main() {
    input! {
        n: usize,
        m: usize,
        mut s: [Chars; n],
    };

    let mut count = 0_usize;
    for i in 0..n {
        for j in 0..m {
            if s[i][j] != '#' {
                continue;
            }
            s[i][j] = '.';
            if ok(n, m, &s) {
                count += 1;
            }
            s[i][j] = '#';
        }
    }
    let ans = count;
    println!("{}", ans);
}

今日のコミット。