結果
| 問題 |
No.2641 draw X
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-06-29 02:27:03 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 6,526 bytes |
| コンパイル時間 | 15,047 ms |
| コンパイル使用メモリ | 398,696 KB |
| 実行使用メモリ | 109,220 KB |
| 最終ジャッジ日時 | 2025-06-29 02:27:23 |
| 合計ジャッジ時間 | 17,728 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 3 |
| other | AC * 16 TLE * 1 -- * 24 |
ソースコード
use std::collections::HashMap;
use std::io::{self, BufRead};
fn main() {
// 入力
let stdin = io::stdin();
let mut lines = stdin.lock().lines().map(|l| l.unwrap());
let first = lines.next().unwrap();
let mut first_it = first.split_whitespace();
let h: usize = first_it.next().unwrap().parse().unwrap();
let w: usize = first_it.next().unwrap().parse().unwrap();
let s: Vec<Vec<char>> = lines.take(h).map(|line| line.chars().collect()).collect();
// i_j1, i_j2
let mut i_j1: HashMap<i32, Vec<usize>> = HashMap::new();
let mut i_j2: HashMap<i32, Vec<usize>> = HashMap::new();
for i in 0..h {
for j in 0..w {
let x = i as i32 + j as i32;
let y = i as i32 - j as i32;
i_j1.entry(x).or_default().push(i);
i_j2.entry(y).or_default().push(i);
}
}
// i_j1_cums
let mut i_j1_cums: HashMap<i32, HashMap<usize, i32>> = HashMap::new();
for (&key, values) in &i_j1 {
let mut values = values.clone();
values.sort_unstable();
let mut new_values = Vec::new();
let mut c = 0;
for &i in &values {
let j = (key as isize - i as isize) as usize;
if s[i][j] == '#' {
c += 1;
}
new_values.push(c);
}
let mut value_map = HashMap::new();
for (idx, &v) in new_values.iter().enumerate() {
value_map.insert(values[idx], v);
}
i_j1_cums.insert(key, value_map);
}
// i_j2_cums
let mut i_j2_cums: HashMap<i32, HashMap<usize, i32>> = HashMap::new();
for (&key, values) in &i_j2 {
let mut values = values.clone();
values.sort_unstable();
let mut new_values = Vec::new();
let mut c = 0;
for &i in &values {
let j = (i as isize - key as isize) as usize;
if s[i][j] == '#' {
c += 1;
}
new_values.push(c);
}
let mut value_map = HashMap::new();
for (idx, &v) in new_values.iter().enumerate() {
value_map.insert(values[idx], v);
}
i_j2_cums.insert(key, value_map);
}
// solve関数
fn solve(ar: &HashMap<usize, i32>, i: usize, mid: i32) -> bool {
let high_i = i as i32 + mid;
let low_i = i as i32 - mid;
let high_i_u = high_i as usize;
let low_i_u = low_i as usize;
if !ar.contains_key(&high_i_u) || !ar.contains_key(&low_i_u) {
return false;
}
if !ar.contains_key(&(low_i_u - 1)) {
let x = ar[&high_i_u];
x == 1 + 2 * mid
} else {
let x = ar[&high_i_u];
let x1 = ar[&(low_i_u - 1)];
(x - x1) == 1 + 2 * mid
}
}
let mut i_j1_imos: HashMap<i32, HashMap<usize, i32>> = HashMap::new();
let mut i_j2_imos: HashMap<i32, HashMap<usize, i32>> = HashMap::new();
for i in 0..h {
for j in 0..w {
if s[i][j] != '#' {
continue;
}
let mut is_ok = true;
for (di, dj) in &[(1, 1), (1, -1), (-1, 1), (-1, -1)] {
let new_i = i as isize + di;
let new_j = j as isize + dj;
if new_i < 0 || new_i >= h as isize || new_j < 0 || new_j >= w as isize {
is_ok = false;
break;
}
if s[new_i as usize][new_j as usize] == '.' {
is_ok = false;
break;
}
}
if !is_ok {
continue;
}
// i_j1
let key1 = i as i32 + j as i32;
let ar1 = &i_j1_cums[&key1];
let mut low = 1;
let mut high = h.max(w) as i32;
while high - low > 1 {
let mid = (high + low) / 2;
if solve(ar1, i, mid) {
low = mid;
} else {
high = mid;
}
}
let ij1_val = if solve(ar1, i, high) { high } else { low };
// i_j2
let key2 = i as i32 - j as i32;
let ar2 = &i_j2_cums[&key2];
let mut low = 1;
let mut high = h.max(w) as i32;
while high - low > 1 {
let mid = (high + low) / 2;
if solve(ar2, i, mid) {
low = mid;
} else {
high = mid;
}
}
let ij2_val = if solve(ar2, i, high) { high } else { low };
let ans = ij1_val.min(ij2_val);
// imos
let min_i = i as i32 - ans;
let max_i = i as i32 + ans + 1;
i_j1_imos.entry(key1).or_default().entry(min_i as usize).and_modify(|v| *v += 1).or_insert(1);
i_j1_imos.entry(key1).or_default().entry(max_i as usize).and_modify(|v| *v -= 1).or_insert(-1);
i_j2_imos.entry(key2).or_default().entry(min_i as usize).and_modify(|v| *v += 1).or_insert(1);
i_j2_imos.entry(key2).or_default().entry(max_i as usize).and_modify(|v| *v -= 1).or_insert(-1);
}
}
let mut passed = vec![vec![0i32; w]; h];
for (&key, values_map) in &i_j1_imos {
let min_i = *values_map.keys().min().unwrap();
let max_i = *values_map.keys().max().unwrap();
let mut c = 0;
for i in min_i..max_i {
if let Some(v) = values_map.get(&i) {
c += v;
}
let j0 = (key - i as i32) as usize;
if i < h && j0 < w {
passed[i][j0] += c;
}
}
}
for (&key, values_map) in &i_j2_imos {
let min_i = *values_map.keys().min().unwrap();
let max_i = *values_map.keys().max().unwrap();
let mut c = 0;
for i in min_i..max_i {
if let Some(v) = values_map.get(&i) {
c += v;
}
let j0 = (i as i32 - key) as usize;
if i < h && j0 < w {
passed[i][j0] += c;
}
}
}
let mut is_ok = true;
for i in 0..h {
for j in 0..w {
if passed[i][j] > 0 && s[i][j] == '.' {
is_ok = false;
}
if passed[i][j] == 0 && s[i][j] == '#' {
is_ok = false;
}
}
}
if is_ok {
println!("Yes");
} else {
println!("No");
}
}