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 |
|
|
| 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 |