二维差分

引入

差分都是基于前缀和的,一维差分的前缀和很简单,最需要处理区间两端。而二维的前缀和是sum[i][j]=a[i][j]+sum[i1][j]+sum[i][j1]sum[i1][j1]sum[i][j]=a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1],我们在(x1,y1)(x_1,y_1)+a+a,影响了右边和下边的蓝色区域,需要a-a,但两区域的重叠部分绿色被多减了一次,需要+a+a二维差分

于是在(x1,y1)(x_1,y_1)(x2,y2)(x_2,y_2)+a+a,需要在sum[x1][y1]+=a,sum[x1][y2+1]=a,sum[x2+1][y1]=a,sum[x2+1][y2+1]+=asum[x_1][y_1]+=a,sum[x_1][y_2+1]-=a,sum[x_2+1][y_1]-=a,sum[x_2+1][y_2+1]+=a

相关文章: