一维前缀和
模板题目链接:795. 前缀和
参考代码:
m,n = [int(x) for x in input().split(' ')]
nums = [int(x) for x in input().split(' ')]
pre = [0 for i in range(len(nums) + 1)]
for i in range(len(nums)):
pre[i + 1] = nums[i] + pre[i]
for i in range(n):
start, end = [int(x) for x in input().split(' ')]
print(pre[end] - pre[start - 1])
二维前缀和
模板题目链接:796. 子矩阵的和
n, m, q = [int(x) for x in input().split(' ')]
matrix = []
for _ in range(n):
matrix.append([int(x) for x in input().split(' ')])
pre = [[0 for _ in range(m + 1)] for _ in range(n + 1)]
for i in range(1, n + 1):
for j in range(1, m + 1):
pre[i][j] = matrix[i - 1][j - 1] + pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1]
for _ in range(q):
x1, y1, x2, y2 = [int(x) for x in input().split(' ')]
print(pre[x2][y2] - pre[x2][y1 - 1] - pre[x1 - 1][y2] + pre[x1 - 1][y1 - 1])
一维差分数组
模板题目链接:797. 差分
import java.util.*;
public class Main{
public static void insert(int[] s, int l, int r, int v) {
s[l] = s[l] + v;
s[r + 1] = s[r + 1] - v;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] s = new int[n + 1];
for(int i = 0; i < n; i ++) {
int t = sc.nextInt();
insert(s, i, i, t);
}
for(int i = 0; i < m; i++) {
int l = sc.nextInt();
int r = sc.nextInt();
int v = sc.nextInt();
insert(s, l - 1, r - 1, v);
}
for(int i = 1; i < n; i++) {
s[i] += s[i - 1];
}
for(int i = 0; i < n; i++) {
System.out.print(s[i] + ((i != n -1) ? " " : ""));
}
sc.close();
}
}
二维差分数组
模板题目链接:AcWing 798. 差分矩阵
#include <iostream>
using namespace std;
const int N = 1010;
int matrix[N][N];
void insert(int x1, int y1, int x2, int y2, int t)
{
matrix[x1][y1] += t;
matrix[x2 + 1][y1] -= t;
matrix[x1][y2 + 1] -= t;
matrix[x2 + 1][y2 + 1] += t;
}
int main()
{
int n,m,q;
cin >> n >> m >> q;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
int t;
cin >> t;
insert(i, j, i, j, t);
}
}
for(int i = 0; i < q; i++)
{
int x1, x2, y1, y2, v;
cin >> x1 >> y1 >> x2 >> y2 >> v;
insert(x1, y1, x2, y2, v);
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
matrix[i][j] = matrix[i][j] + matrix[i - 1][j] + matrix[i][j - 1] - matrix[i - 1][j - 1];
cout << matrix[i][j];
if(j != m) cout << " ";
}
cout << endl;
}
return 0;
}