前缀和
一维前缀和
模版题
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
var reader = bufio.NewReader(os.Stdin)
var x = readArray(reader)
//var n, m = x[0], x[1]
var nums = readArray(reader)
var sums = make([]int, x[0]+1)
for i := 0; i < x[0]; i++ {
sums[i+1] = sums[i] + nums[i]
}
var cnt int
var xx []int
for cnt < x[1] {
xx = readArray(reader)
// 请注意题目下标是从1开始的
fmt.Println(sums[xx[1]] - sums[xx[0]-1])
cnt++
}
}
func readLine(reader *bufio.Reader) string {
var line, _ = reader.ReadString('\n')
return strings.TrimRight(line, "\n")
}
func readInt(reader *bufio.Reader) int {
var num, _ = strconv.Atoi(readLine(reader))
return num
}
func readArray(reader *bufio.Reader) []int {
var line = readLine(reader)
var strList = strings.Split(line, " ")
var nums = make([]int, 0)
var err error
var v int
for i := 0; i < len(strList); i++ {
if v, err = strconv.Atoi(strList[i]); err != nil {
continue
}
nums = append(nums, v)
}
return nums
}
func nums2string(x []int, sep string) string {
var b strings.Builder
for i := 0; i < len(x); i++ {
b.WriteString(strconv.Itoa(x[i]))
b.WriteString(sep)
}
return b.String()
}
/*
输入一个长度为n的整数序列。
接下来再输入m个询问,每个询问输入一对l, r。
对于每个询问,输出原序列中从第l个数到第r个数的和。
输入格式
第一行包含两个整数n和m。
第二行包含n个整数,表示整数数列。
接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。
输出格式
共m行,每行输出一个询问的结果。
数据范围
1≤l≤r≤n,
1≤n,m≤100000,
−1000≤数列中元素的值≤1000
输入样例:
5 3
2 1 3 6 4
1 2
1 3
2 4
输出样例:
3
6
10
*/查找数组和
和为K的子数组
Python3
二维前缀和


S[i,j]即为左图红框中所有数的的和为:S[i,j]=S[i,j−1]+S[i−1,j]−S[i−1,j−1]+a[i,j] (x1,y1),(x2,y2)这一子矩阵中的所有数之和为:S[x2,y2]−S[x1−1,y2]−S[x2,y1−1]+S[x1−1,y1−1]
模版题
统计全为1的正方形子矩阵
Python3(超时)
Golang
最后更新于
这有帮助吗?