Submission #73329228


Source Code Expand

use proconio::{input, marker::Chars};
use std::collections::VecDeque;

fn dfs_bipartite(
    u: usize,
    adj: &Vec<Vec<usize>>,
    match_right: &mut Vec<Option<usize>>,
    visited: &mut Vec<bool>,
) -> bool {
    for &v in &adj[u] {
        if visited[v] {
            continue;
        }
        visited[v] = true;
        if match_right[v].is_none() || dfs_bipartite(match_right[v].unwrap(), adj, match_right, visited) {
            match_right[v] = Some(u);
            return true;
        }
    }
    false
}

fn main() {
    input! {
        N: usize,
        A: i32,
        B: i32,
        S: [Chars; N],
    }

    let mut cells = vec![];
    let mut cell_to_id = vec![vec![None; N]; N];
    for i in 0..N {
        for j in 0..N {
            if S[i][j] == '.' {
                cell_to_id[i][j] = Some(cells.len());
                cells.push((i as i32, j as i32));
            }
        }
    }
    let V = cells.len();

    let moves = [
        (A, B),
        (B, A),
        (B, -A),
        (A, -B),
        (-A, -B),
        (-B, -A),
        (-B, A),
        (-A, B),
    ];

    let mut graph = vec![vec![]; V];
    for (idx, &(i, j)) in cells.iter().enumerate() {
        for &(dx, dy) in &moves {
            let ni = i + dx;
            let nj = j + dy;
            if ni >= 0 && ni < N as i32 && nj >= 0 && nj < N as i32 {
                if let Some(nidx) = cell_to_id[ni as usize][nj as usize] {
                    graph[idx].push(nidx);
                }
            }
        }
    }

    let mut color = vec![-1; V];
    for start in 0..V {
        if color[start] == -1 {
            let mut q = VecDeque::new();
            color[start] = 0;
            q.push_back(start);
            while let Some(u) = q.pop_front() {
                for &v in &graph[u] {
                    if color[v] == -1 {
                        color[v] = 1 - color[u];
                        q.push_back(v);
                    } else if color[v] == color[u] {
                        panic!("not bipartite");
                    }
                }
            }
        }
    }

    let mut left_ids = vec![];
    let mut right_ids = vec![];
    let mut id_to_left = vec![None; V];
    let mut id_to_right = vec![None; V];

    for (id, &c) in color.iter().enumerate() {
        if c == 0 {
            id_to_left[id] = Some(left_ids.len());
            left_ids.push(id);
        } else {
            id_to_right[id] = Some(right_ids.len());
            right_ids.push(id);
        }
    }

    let n_left = left_ids.len();
    let n_right = right_ids.len();

    let mut adj_left = vec![vec![]; n_left];
    for (orig_u, &c) in color.iter().enumerate() {
        if c == 0 {
            let u = id_to_left[orig_u].unwrap();
            for &orig_v in &graph[orig_u] {
                if color[orig_v] == 1 {
                    let v = id_to_right[orig_v].unwrap();
                    adj_left[u].push(v);
                }
            }
        }
    }

    let mut match_right = vec![None; n_right];
    for u in 0..n_left {
        let mut visited = vec![false; n_right];
        dfs_bipartite(u, &adj_left, &mut match_right, &mut visited);
    }

    // 交替路BFS:未マッチの左頂点から開始
    let mut vis_l = vec![false; n_left];
    let mut vis_r = vec![false; n_right];
    let mut q = VecDeque::new();

    for u in 0..n_left {
        if !match_right.contains(&Some(u)) {
            vis_l[u] = true;
            q.push_back(('L', u));
        }
    }

    while let Some((side, idx)) = q.pop_front() {
        if side == 'L' {
            // 左 → 右:非マッチ辺を使う
            for &v in &adj_left[idx] {
                if match_right[v] != Some(idx) && !vis_r[v] {
                    vis_r[v] = true;
                    q.push_back(('R', v));
                }
            }
        } else {
            // 右 → 左:マッチ辺を使う
            if let Some(u2) = match_right[idx] {
                if !vis_l[u2] {
                    vis_l[u2] = true;
                    q.push_back(('L', u2));
                }
            }
        }
    }

    let mut in_independent_set = vec![false; V];
    for (orig_id, &c) in color.iter().enumerate() {
        if c == 0 {
            let pos = id_to_left[orig_id].unwrap();
            if vis_l[pos] {
                in_independent_set[orig_id] = true;
            }
        } else {
            let pos = id_to_right[orig_id].unwrap();
            if !vis_r[pos] {
                in_independent_set[orig_id] = true;
            }
        }
    }

    let mut result = vec![vec!['.'; N]; N];
    for i in 0..N {
        for j in 0..N {
            if S[i][j] == '#' {
                result[i][j] = '#';
            }
        }
    }
    for (idx, &(i, j)) in cells.iter().enumerate() {
        if in_independent_set[idx] {
            result[i as usize][j as usize] = 'o';
        }
    }

    for row in result {
        println!("{}", row.iter().collect::<String>());
    }
}

Submission Info

Submission Time
Task G - Knight Placement
User memoka
Language Rust (rustc 1.89.0)
Score 600
Code Size 5187 Byte
Status AC
Exec Time 671 ms
Memory 23824 KiB

Compile Error

warning: variable `N` should have a snake case name
  --> src/main.rs:25:9
   |
25 |         N: usize,
   |         ^ help: convert the identifier to snake case: `n`
   |
   = note: `#[warn(non_snake_case)]` on by default

warning: variable `A` should have a snake case name
  --> src/main.rs:26:9
   |
26 |         A: i32,
   |         ^ help: convert the identifier to snake case: `a`

warning: variable `B` should have a snake case name
  --> src/main.rs:27:9
   |
27 |         B: i32,
   |         ^ help: convert the identifier to snake case: `b`

warning: variable `S` should have a snake case name
  --> src/main.rs:28:9
   |
28 |         S: [Chars; N],
   |         ^ help: convert the identifier to snake case (notice the capitalization): `s`

warning: variable `V` should have a snake case name
  --> src/main.rs:41:9
   |
41 |     let V = cells.len();
   |         ^ help: convert the identifier to snake case (notice the capitalization): `v`

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 3
AC × 86
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 01_random_15.txt, 01_random_16.txt, 01_random_17.txt, 01_random_18.txt, 01_random_19.txt, 01_random_20.txt, 01_random_21.txt, 01_random_22.txt, 01_random_23.txt, 01_random_24.txt, 01_random_25.txt, 01_random_26.txt, 01_random_27.txt, 01_random_28.txt, 01_random_29.txt, 01_random_30.txt, 01_random_31.txt, 01_random_32.txt, 01_random_33.txt, 01_random_34.txt, 01_random_35.txt, 01_random_36.txt, 01_random_37.txt, 01_random_38.txt, 01_random_39.txt, 01_random_40.txt, 01_random_41.txt, 01_random_42.txt, 01_random_43.txt, 01_random_44.txt, 01_random_45.txt, 01_random_46.txt, 01_random_47.txt, 01_random_48.txt, 01_random_49.txt, 01_random_50.txt, 01_random_51.txt, 01_random_52.txt, 01_random_53.txt, 01_random_54.txt, 01_random_55.txt, 01_random_56.txt, 01_random_57.txt, 01_random_58.txt, 01_random_59.txt, 01_random_60.txt, 01_random_61.txt, 01_random_62.txt, 01_random_63.txt, 01_random_64.txt, 01_random_65.txt, 01_random_66.txt, 01_random_67.txt, 01_random_68.txt, 01_random_69.txt, 01_random_70.txt, 01_random_71.txt, 01_random_72.txt, 01_random_73.txt, 01_random_74.txt, 01_random_75.txt, 01_random_76.txt, 01_random_77.txt, 01_random_78.txt, 01_random_79.txt, 01_random_80.txt, 01_random_81.txt, 01_random_82.txt, 01_random_83.txt, 01_random_84.txt, 01_random_85.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 1916 KiB
00_sample_01.txt AC 0 ms 1884 KiB
00_sample_02.txt AC 1 ms 1988 KiB
01_random_03.txt AC 163 ms 11492 KiB
01_random_04.txt AC 65 ms 9460 KiB
01_random_05.txt AC 33 ms 8860 KiB
01_random_06.txt AC 2 ms 3984 KiB
01_random_07.txt AC 2 ms 3904 KiB
01_random_08.txt AC 2 ms 3964 KiB
01_random_09.txt AC 319 ms 14836 KiB
01_random_10.txt AC 482 ms 15800 KiB
01_random_11.txt AC 529 ms 19012 KiB
01_random_12.txt AC 3 ms 5020 KiB
01_random_13.txt AC 9 ms 5328 KiB
01_random_14.txt AC 10 ms 5528 KiB
01_random_15.txt AC 190 ms 13072 KiB
01_random_16.txt AC 83 ms 12508 KiB
01_random_17.txt AC 440 ms 14776 KiB
01_random_18.txt AC 152 ms 11252 KiB
01_random_19.txt AC 10 ms 8700 KiB
01_random_20.txt AC 86 ms 9844 KiB
01_random_21.txt AC 2 ms 4060 KiB
01_random_22.txt AC 2 ms 3908 KiB
01_random_23.txt AC 2 ms 4060 KiB
01_random_24.txt AC 8 ms 13036 KiB
01_random_25.txt AC 509 ms 17768 KiB
01_random_26.txt AC 133 ms 13672 KiB
01_random_27.txt AC 10 ms 5428 KiB
01_random_28.txt AC 5 ms 5148 KiB
01_random_29.txt AC 3 ms 5108 KiB
01_random_30.txt AC 8 ms 12064 KiB
01_random_31.txt AC 106 ms 12612 KiB
01_random_32.txt AC 437 ms 17040 KiB
01_random_33.txt AC 55 ms 8932 KiB
01_random_34.txt AC 8 ms 8576 KiB
01_random_35.txt AC 148 ms 10768 KiB
01_random_36.txt AC 2 ms 4008 KiB
01_random_37.txt AC 2 ms 4064 KiB
01_random_38.txt AC 2 ms 4080 KiB
01_random_39.txt AC 607 ms 17380 KiB
01_random_40.txt AC 561 ms 16696 KiB
01_random_41.txt AC 480 ms 18736 KiB
01_random_42.txt AC 8 ms 5432 KiB
01_random_43.txt AC 8 ms 5316 KiB
01_random_44.txt AC 8 ms 5380 KiB
01_random_45.txt AC 337 ms 13964 KiB
01_random_46.txt AC 393 ms 19956 KiB
01_random_47.txt AC 423 ms 14300 KiB
01_random_48.txt AC 145 ms 10864 KiB
01_random_49.txt AC 150 ms 11016 KiB
01_random_50.txt AC 150 ms 11300 KiB
01_random_51.txt AC 2 ms 3996 KiB
01_random_52.txt AC 2 ms 4052 KiB
01_random_53.txt AC 2 ms 3968 KiB
01_random_54.txt AC 522 ms 18396 KiB
01_random_55.txt AC 143 ms 13656 KiB
01_random_56.txt AC 143 ms 13676 KiB
01_random_57.txt AC 4 ms 5236 KiB
01_random_58.txt AC 5 ms 5364 KiB
01_random_59.txt AC 5 ms 5144 KiB
01_random_60.txt AC 393 ms 18204 KiB
01_random_61.txt AC 421 ms 17936 KiB
01_random_62.txt AC 427 ms 15604 KiB
01_random_63.txt AC 97 ms 9832 KiB
01_random_64.txt AC 96 ms 9796 KiB
01_random_65.txt AC 96 ms 10004 KiB
01_random_66.txt AC 2 ms 3952 KiB
01_random_67.txt AC 2 ms 3880 KiB
01_random_68.txt AC 2 ms 4080 KiB
01_random_69.txt AC 144 ms 13508 KiB
01_random_70.txt AC 525 ms 16612 KiB
01_random_71.txt AC 144 ms 13620 KiB
01_random_72.txt AC 5 ms 5332 KiB
01_random_73.txt AC 3 ms 5044 KiB
01_random_74.txt AC 3 ms 5060 KiB
01_random_75.txt AC 433 ms 15340 KiB
01_random_76.txt AC 104 ms 12488 KiB
01_random_77.txt AC 103 ms 12524 KiB
01_random_78.txt AC 480 ms 20952 KiB
01_random_79.txt AC 465 ms 20892 KiB
01_random_80.txt AC 671 ms 23824 KiB
01_random_81.txt AC 435 ms 20320 KiB
01_random_82.txt AC 0 ms 1924 KiB
01_random_83.txt AC 0 ms 1964 KiB
01_random_84.txt AC 0 ms 2036 KiB
01_random_85.txt AC 0 ms 1928 KiB