AcWing 798. 差分矩阵-go
package main
import(
"fmt"
"bufio"
"os"
"strconv"
"strings"
)
var scan *bufio.Scanner
var sliA, sliB [][]int
func main(){
var n, m, q int
fmt.Scan(&n, &m, &q)
scan = bufio.NewScanner(os.Stdin)
sliA, sliB = make([][]int, n+2), make([][]int, n+2)
for i := 0; i < len(sliA); i++{
sliA[i] = make([]int, m+2)
sliB[i] = make([]int, m+2)
}
for i := 1; i <= n; i++{
sli := readLine()
for j := 0; j < len(sli); j++{
sliA[i][j+1] = sli[j]
insert(i, j+1, i, j+1, sliA[i][j+1])
}
}
for i := 0; i < q; i++{
sli := readLine()
insert(sli[0], sli[1], sli[2], sli[3], sli[4])
}
for i := 1; i <= n; i++{
for j := 1; j <= m; j++{
sliB[i][j] += sliB[i-1][j] + sliB[i][j-1] - sliB[i-1][j-1]
}
}
for i := 1; i <= n; i++{
for j := 1; j <= m; j++{
if j != m{
fmt.Printf("%d ", sliB[i][j])
}else{
fmt.Printf("%d\n", sliB[i][j])
}
}
}
}
func insert(x1, y1, x2, y2 int, c int){
sliB[x1][y1] += c
sliB[x1][y2+1] -= c
sliB[x2+1][y1] -= c
sliB[x2+1][y2+1] += c
}
func readLine()[]int{
scan.Scan()
str := scan.Text()
sli := strings.Split(str, " ")
numSli := make([]int, len(sli))
for index, item := range sli{
num, _ := strconv.Atoi(item)
numSli[index] = num
}
return numSli
}