競プロ典型 004

https://atcoder.jp/contests/typical90/tasks/typical90_d

 \displaystyle SR_i = \sum_{j=1}^W{A_{i,j}} \quad (1 \le i \le H)
 \displaystyle SC_j = \sum_{i=1}^H{A_{i,j}} \quad (1 \le j \le W)
とすれば、
 B_{i,j} = SR_i + SC_j - A_{i,j}
となります。

// Cross Sum
#![allow(non_snake_case)]


//////////////////// library ////////////////////

fn read<T: std::str::FromStr>() -> T {
    let mut line = String::new();
    std::io::stdin().read_line(&mut line).ok();
    line.trim().parse().ok().unwrap()
}

fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    read::<String>().split_whitespace()
            .map(|e| e.parse().ok().unwrap()).collect()
}


//////////////////// process ////////////////////

type Matrix = Vec<Vec<i32>>;

fn print_mat(M: &Matrix) {
    for v in M.iter() {
        let ss: Vec<String> = v.iter().map(|e| e.to_string()).collect();
        println!("{}", ss.join(" "))
    }
}

fn read_input() -> Matrix {
    let v: Vec<i32> = read_vec();
    let (H, _W) = (v[0], v[1]);
    let A: Matrix = (0..H).map(|_| read_vec::<i32>()).collect();
    A
}

fn F(A: Matrix) {
    let H = A.len();
    let W = A[0].len();
    let sum_rows: Vec<i32> = A.iter().map(|v| v.iter().sum::<i32>()).collect();
    let sum_cols: Vec<i32> = (0..W).map(|c|
                                    (0..H).map(|r| A[r][c]).sum::<i32>()).
                                                                collect();
    let cross_sum = |i: usize, j: usize| -> i32 {
        sum_rows[i] + sum_cols[j] - A[i][j]
    };
    let B: Matrix = (0..H).map(|r| (0..W).map(|c| cross_sum(r, c)).
                                                    collect::<Vec<i32>>()).
                                                                    collect();
    print_mat(&B)
}

fn main() {
    let A = read_input();
    F(A)
}