二维前缀和
AcWing 796. 子矩阵的和
一. 题目详情
输入一个 nn 行 mm 列的整数矩阵,再输入 qq 个询问,每个询问包含四个整数 x1,y1,x2,y2x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。
对于每个询问输出子矩阵中所有数的和。
输入格式
第一行包含三个整数 n,m,qn,m,q。
接下来 nn 行,每行包含 mm 个整数,表示整数矩阵。
接下来 qq 行,每行包含四个整数 x1,y1,x2,y2x1,y1,x2,y2,表示一组询问。
输出格式
共 qq 行,每行输出一个询问的结果。
数据范围
1≤n,m≤10001≤n,m≤1000,
1≤q≤2000001≤q≤200000,
1≤x1≤x2≤n1≤x1≤x2≤n,
1≤y1≤y2≤m1≤y1≤y2≤m,
−1000≤矩阵内元素的值≤1000−1000≤矩阵内元素的值≤1000
输入样例:
1 | 3 4 3 |
输出样例:
1 | 17 |
二. 算法思想

| 计算s[i,j] | 计算s[(x1,y1)(x2,y2)] | |
|---|---|---|
| 红点 | a[i,j] | a[x2,y2] |
| 绿点 | a[i-1,j-1] | a[x1-1,y1-1] (x1,y1)系类减了1才不在范围四点包围内) |
| 黄点 | a[i,j-1] | a[x1-1,y2](同上) |
| 蓝点 | a[i,j-1] | a[x2,y1-1](同上) |
1. 计算前缀和s[i,j] = a[i,j] - s[i-1,j]-s[i,j-1]+s[i-1,j-1]
红点 + 两蓝面 -(两南面重合多加的黄面)
2. 计算区域前缀和 s[(x1,y1)~(x2,y2)]=s[x2,y2]-s[x1-1,y2]-s[x2,y1-1]+s[x-1,y-1]
最大框内正方形 - 两蓝面 +(两南面重合多减的黄面)
三. 笔者代码
1 | import java.util.Scanner; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 随意!
评论
ValineDisqus





