前缀和与差分
前缀和
一维
for  ( int  i  =  1 ;  i  <=  n ;  i++ )
        sum [ i ]  =  sum [ i - 1 ]  + a [ i ] ;
区间查询
∑( a [  l  ] --> a [  r  ] )  =  sum [ r ]  -  sum [  l - 1 ] ;
二维
for  ( int  i  =  1 ;   i  <=  n ;  i++ )
        for  ( int  j  =  1 ;  j  <=  m ;  j++ )
            s [ i ][ j ]  =  s [ i - 1][ j ]  +  s [ i ][ j - 1 ]  +  a [ i ][ j ] - s[ i - 1 ][ j - 1 ] ;
区间查询:
以x1,y1为左上角,x2,y2为右下角的区间
s [ x2 ][ y2 ] - s [ x1 - 1 ][ y2 ] - s [ x2 ][ y1 - 1 ] + s [ x1 - 1 ][  y1 - 1 ] ; 
差分
一维
 for  ( int  i  =  1 ;  i  <=  n ;  i++ )
        c [ i ]  =  a [ i ] - a [ i - 1 ] ;
区间操作
区间(l,r)同增 x : c [ l ]  +=  x ;   c [ r + 1 ]    −=  x ; 
二维
相当于二维区间查询时单位 s [ i ][ j ] 的值。
 for  ( int  i  =  1 ;  i  <=  n ;  i++ )
        for  ( int  j  =  1 ;  j  <=  m ;  j++ )
            c [ i ][ j ]  =  a [ i ][ j ] − a [ i−1 ][ j ] − a[ i ][ j−1 ]  +  a [ i−1 ][ j−1 ] ;
区间操作
    c [ x1 ][ y1 ]  +=  x ;
    c [ x2 + 1 ][ y1 ]  −= x ;
    c [ x1 ][ y2 + 1 ]  −= x ;
    c [ x2 + 1 ][ y2 + 1 ]  −= x ;

                
            
        
浙公网安备 33010602011771号