输入一个n行m列的整数矩阵,再输入q个操作,每个操作包含五个整数x1, y1, x2, y2, c,其中(x1, y1)和(x2, y2)表示一个子矩阵的左上角坐标和右下角坐标。
每个操作都要将选中的子矩阵中的每个元素的值加上c。
请你将进行完所有操作后的矩阵输出。
输入格式
第一行包含整数n,m,q。
接下来n行,每行包含m个整数,表示整数矩阵。
接下来q行,每行包含5个整数x1, y1, x2, y2, c,表示一个操作。
输出格式
共 n 行,每行 m 个整数,表示所有操作进行完毕后的最终矩阵。
数据范围
1≤n,m≤1000,
1≤q≤100000,
1≤x1≤x2≤n,
1≤y1≤y2≤m,
−1000≤c≤1000,
−1000≤矩阵内元素的值≤1000
输入样例:
3 4 3
1 2 2 1
3 2 2 1
1 1 1 1
1 1 2 2 1
1 3 2 3 2
3 1 3 4 1
输出样例:
2 3 4 1
4 3 4 1
2 2 2 2
Go 代码 TLE
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// 插入函数
func insert(b [][]int, x1, y1, x2, y2, c int) {
b[x1][y1] += c
b[x2+1][y1] -= c
b[x1][y2+1] -= c
b[x2+1][y2+1] += c
}
var scanner *bufio.Scanner
func main() {
var n, m, q int
// file, _ := os.Open("./1.txt")
// defer file.Close()
scanner = bufio.NewScanner(os.Stdin)
bs := make([]byte, 20000*1024)
scanner.Buffer(bs, len(bs))
nmq := readLine()
n, m, q = nmq[0], nmq[1], nmq[2]
a := make([][]int, n+2)
for i := 0; i < len(a); i++ {
a[i] = make([]int, m+2)
}
for i := 0; i < n; i++ {
nRow := readLine() // 每次读取1行,读取n行
for j := 0; j < len(nRow); j++ {
a[i+1][j+1] = nRow[j]
}
}
b := make([][]int, n+2) // 差分数组
for i := 0; i < len(b); i++ {
b[i] = make([]int, m+2)
}
for i := 1; i <= n; i++ {
for j := 1; j <= m; j++ {
insert(b, i, j, i, j, a[i][j])
}
}
// 接下来输入q次操作,每个操作包含五个整数x1, y1, x2, y2, c
for i := 0; i < q; i++ {
l := readLine()
insert(b, l[0], l[1], l[2], l[3], l[4])
}
// 输出进行完所有操作后的序列
for i := 1; i <= n; i++ {
for j := 1; j <= m; j++ {
b[i][j] += b[i-1][j] + b[i][j-1] - b[i-1][j-1] // 即对差分数组求一遍前缀和
fmt.Printf("%d ", b[i][j])
}
fmt.Println()
}
}
func readLine() []int {
scanner.Scan()
line := strings.Split(strings.TrimSpace(scanner.Text()), " ")
res := make([]int, len(line))
for i, num := range line {
x, _ := strconv.Atoi(num)
res[i] = x
}
return res
}
Go实现 优化
优化一:a的输入省略
优化二:fmt.Printf()优化
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// 插入函数
func insert(b [][]int, x1, y1, x2, y2, c int) {
b[x1][y1] += c
b[x2+1][y1] -= c
b[x1][y2+1] -= c
b[x2+1][y2+1] += c
}
var scanner *bufio.Scanner
func main() {
var n, m, q int
// file, _ := os.Open("./1.txt")
// defer file.Close()
scanner = bufio.NewScanner(os.Stdin)
bs := make([]byte, 20000*1024)
scanner.Buffer(bs, len(bs))
nmq := readLine()
n, m, q = nmq[0], nmq[1], nmq[2]
b := make([][]int, n+2) // 差分数组
for i := 0; i < len(b); i++ {
b[i] = make([]int, m+2)
}
for i := 1; i <= n; i++ {
nRow := readLine()
for j := 0; j < m; j++ {
insert(b, i, j+1, i, j+1, nRow[j])
}
}
// 接下来输入q次操作,每个操作包含五个整数x1, y1, x2, y2, c
for i := 0; i < q; i++ {
l := readLine()
insert(b, l[0], l[1], l[2], l[3], l[4])
}
// 输出进行完所有操作后的序列
for i := 1; i <= n; i++ {
res := make([]string, m)
for j := 1; j <= m; j++ {
b[i][j] += b[i-1][j] + b[i][j-1] - b[i-1][j-1] // 即对差分数组求一遍前缀和
res[j-1] = strconv.Itoa(b[i][j])
}
fmt.Println(strings.Join(res, " "))
}
}
func readLine() []int {
scanner.Scan()
line := strings.Split(strings.TrimSpace(scanner.Text()), " ")
res := make([]int, len(line))
for i, num := range line {
x, _ := strconv.Atoi(num)
res[i] = x
}
return res
}