5 前缀和与差分
5.1 一维区间和
-
输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r。对于每个询问,输出原序列中从第 l个数到第 r个数的和。
-
输入格式
-
第一行包含两个整数 n和 m。
-
第二行包含 n个整数,表示整数数列。
-
接下来 m行,每行包含两个整数 l和 r,表示一个询问的区间范围。
-
-
输出格式:共 m行,每行输出一个询问的结果。
-
数据范围
- 1≤l≤r≤n
- 1≤n,m≤100000
- −1000≤数列中元素的值≤1000
-
输入样例:
1
2
3
4
55 3
2 1 3 6 4
1 2
1 3
2 4 -
输出样例:
1
2
33
6
10
5.1.1 模板
1 |
|
5.2 二维区间和
-
输入一个 n行 m列的整数矩阵,再输入 q个询问,每个询问包含四个整数 x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。对于每个询问输出子矩阵中所有数的和。
-
输入格式
-
第一行包含三个整数 n,m,q。
-
接下来 n行,每行包含 m个整数,表示整数矩阵。
-
接下来 q行,每行包含四个整数 x1,y1,x2,y2,表示一组询问。
-
-
输出格式:共 q行,每行输出一个询问的结果。
-
数据范围
- 1≤n,m≤1000,
- 1≤q≤200000,
- 1≤x1≤x2≤n,
- 1≤y1≤y2≤m,
- −1000≤矩阵内元素的值≤1000
-
输入样例:
1
2
3
4
5
6
73 4 3
1 7 2 4
3 6 2 8
2 1 2 3
1 1 2 2
2 1 3 4
1 3 3 4 -
输出样例:
1
2
317
27
21
5.2.1 思想
- 画矩形分块:
-
5.2.2 模板
1 |
|
5.3 差分
- 已知:
-
- 求:
-
- 要求:
-
-
是 的前缀和 - 差分的作用:假设你需要将从
到 之间的数全都加上一个常熟C,在 上操作需要 ;而在 上操作只需要将 和 就可以了,这样只需要
5.3.1 题目
-
输入一个长度为 n的整数序列。接下来输入 m个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r][𝑙,𝑟] 之间的每个数加上 c。请你输出进行完所有操作后的序列。
-
输入格式
-
第一行包含两个整数 n 和 m。
-
第二行包含 n个整数,表示整数序列。
-
接下来 m行,每行包含三个整数 l,r,c,表示一个操作。
-
-
输出格式
-
共一行,包含 n个整数,表示最终序列。
-
数据范围
- 1≤n,m≤100000,
- 1≤l≤r≤n,
- −1000≤c≤1000,
- −1000≤整数序列中元素的值≤1000
-
输入样例:
1
2
3
4
56 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1 -
输出样例:
1
3 4 5 3 4 2
5.3.2 思想
- 根据a构建b:
1
2
3//假设b是a的差分
b[i] += a[i] //b[i]加一次相当于把后面所有a都加了偏移
b[i+1] -= a[i] //将后面的偏移全部减掉,a不变,假设依然成立
5.3.3 模板
1 |
|
5.4 差分矩阵
-
输入一个 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
-
输入样例:
1
2
3
4
5
6
73 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 -
输出样例:
1
2
32 3 4 1
4 3 4 1
2 2 2 2
5.4.1 思想
-
令b=0,画出矩阵区域得到计算一个
的方法:
5.4.2 模板
1 |
|