前缀和
前缀和其实就是高中数学里数列的前n项和
当题目需要计算数组某个连续范围的和时,利用前缀和可以避免重复计算,以免TLE
一维前缀和
$$
定义式:sum[i] = \sum_{j = 0}^{i} array[j] \
递推式:sum[i] = sum[i-1]+array[i]
$$
二维前缀和
$$
定义式:sum[x][y] = \sum_{i = 0}^{x} \sum_{j = 0}^{y} array[i][j] \递推式: sum[x][y] = sum[x-1][y]+sum[x][y-1]-sum[x-1][y-1]+array[x][y]
$$
实例
待处理的灰度图像长宽皆为 n 个像素,可以表示为一个 n×n 大小的矩阵 A,其中每个元素是一个 [0,L) 范围内的整数,表示对应位置像素的灰度值。
对于矩阵中任意一个元素 $A_{ij}(0≤i,j<n)$,其邻域定义为附近若干元素的集和:
$$
Neighbor(i,j,r)={A_{xy}|0≤x,y<n \ and |x−i|≤r \ and |y−j|≤r}
$$
这里使用了一个额外的参数 r 来指明 Aij 附近元素的具体范围。根据定义,易知 Neighbor(i,j,r) 最多有 (2r+1)2 个元素。
如果元素 Aij 邻域中所有元素的平均值小于或等于一个给定的阈值 t,我们就认为该元素对应位置的像素处于较暗区域。
下图给出了两个例子,左侧图像的较暗区域在右侧图像中展示为黑色,其余区域展示为白色。
现给定邻域参数 r 和阈值 t,试统计输入灰度图像中有多少像素处于较暗区域。
输入格式
输入共 n+1 行。
输入的第一行包含四个用空格分隔的正整数 n、L、r 和 t,含义如前文所述。
第二到第 n+1 行输入矩阵 A。
第 i+2(0≤i<n)行包含用空格分隔的 n 个整数,依次为 Ai0,Ai1,⋯,Ai(n−1)。
输出格式
输出一个整数,表示输入灰度图像中处于较暗区域的像素总数。
代码实现
1 | n,L,r,t = map(int,input().split()) |