アルゴリズムと数学 067

https://atcoder.jp/contests/math-and-algorithm/tasks/typical90_d

包除原理ですね。i行目の和を S_i、j行目の和を T_jとすると、 S_i + T_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 read_input() -> Matrix {
    let v = read_vec();
    let H = v[0];
    let A: Matrix = (0..H).map(|_| read_vec()).collect();
    A
}

fn f(A: Matrix) {
    let H = A.len();
    let W = A[0].len();
    let row_sums: Vec<i32> = A.iter().map(|v| v.iter().sum::<i32>()).collect();
    let col_sums: Vec<i32> = (0..W).map(|j| (0..H).map(|i| A[i][j]).
                                                        sum::<i32>()).collect();
    for i in 0..H {
        let v: Vec<i32> = (0..W).map(|j| row_sums[i] + col_sums[j] - A[i][j]).
                                                                    collect();
        let ss: Vec<String> = v.iter().map(|s| s.to_string()).collect();
        println!("{}", ss.join(" "))
    }
}

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