fn main() { let mut n = String::new(); std::io::stdin().read_line(&mut n).ok(); let n: usize = n.trim().parse().unwrap(); let grid = (0..n).map(|_| { let mut temp = String::new(); std::io::stdin().read_line(&mut temp).ok(); let temp: Vec = temp.trim().split_whitespace().map(|s| s.parse::().unwrap()-1).collect(); temp }) .collect::>(); let mut totals = vec![0usize; n]; let mut ldists = vec![vec![0usize; n]; n]; let mut rdists = vec![vec![0usize; n]; n]; for i in 0..n { for j in 0..n { totals[grid[i][j]] += j; if i > j { ldists[grid[i][j]][i-j-1] += 1; } if i+j+1 < n { rdists[grid[i][j]][i+j+1] += 1; } } } let mut dists = vec![vec![0usize; n]; n]; for i in 0..n { let mut incval = rdists[i][0]; for j in 0..n-1 { let prev = incval; incval += rdists[i][j+1]; rdists[i][j+1] += rdists[i][j] + prev; } let mut incval = ldists[i][n-1]; for j in (1..n).rev() { let prev = incval; incval += ldists[i][j-1]; ldists[i][j-1] += ldists[i][j] + prev; } for j in 0..n { dists[i][j] = totals[i] + ldists[i][j] + rdists[i][j]; } } println!("{}", dists.iter().map(|v| v.iter().min().unwrap()).sum::()); }