赞
踩
差分都是基于前缀和的,一维差分的前缀和很简单,最需要处理区间两端。而二维的前缀和是 s u m [ i ] [ j ] = a [ i ] [ j ] + s u m [ i − 1 ] [ j ] + s u m [ i ] [ j − 1 ] − s u m [ i − 1 ] [ j − 1 ] sum[i][j]=a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1] sum[i][j]=a[i][j]+sum[i−1][j]+sum[i][j−1]−sum[i−1][j−1],我们在 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)处 + a +a +a,影响了右边和下边的蓝色区域,需要 − a -a −a,但两区域的重叠部分绿色被多减了一次,需要 + a +a +a。
于是在 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)到 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)处 + a +a +a,需要在 s u m [ x 1 ] [ y 1 ] + = a , s u m [ x 1 ] [ y 2 + 1 ] − = a , s u m [ x 2 + 1 ] [ y 1 ] − = a , s u m [ x 2 + 1 ] [ y 2 + 1 ] + = a sum[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 sum[x1][y1]+=a,sum[x1][y2+1]−=a,sum[x2+1][y1]−=a,sum[x2+1][y2+1]+=a
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。