#![allow(non_snake_case, unused_imports, unused_macros)] use itertools::{Itertools, iproduct, izip}; use proconio::{fastout, input, marker::Usize1, marker::Chars}; macro_rules! debug { ($($a:expr),* $(,)*) => { #[cfg(debug_assertions)] eprintln!(concat!($("| ", stringify!($a), "={:?} "),*, "|"), $(&$a),*); }; } macro_rules! ndvec { ($v:expr; $n:expr) => { vec![$v; $n] }; ($v:expr; $n:expr, $($ns:expr),+) => { vec![ndvec![$v; $($ns),+]; $n] }; } macro_rules! yes_no { ($e:expr) => { if $e { println!("Yes"); } else { println!("No"); } }; } #[fastout] fn main() { input! { n: usize, s: [Chars; n] } let whites = iproduct!(0..n, 0..n).filter(|&(i, j)| s[i][j] == '#').sorted_unstable().collect_vec(); let blacks = iproduct!(0..n, n..2 * n).filter(|&(i, j)| s[i][j] == '.').sorted_unstable().collect_vec(); println!("{}", izip!(whites, blacks).map(|(wi, bi)| wi.0.abs_diff(bi.0) + wi.1.abs_diff(bi.1)).sum::() ); } #[allow(unused)] fn partition_point(mut l: I, mut r: I, mut f: impl FnMut(I) -> bool) { let one = I::one(); let two = one + one; while l < r { let p = (r - l) / two + l; if f(p) { l = p + one; } else { r = p; } } }