!-- Loading 底层遮罩 -->

前缀和与差分

前缀和

一维

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 ;

 

posted @ 2022-03-30 18:32  Thinker-X  阅读(21)  评论(0)    收藏  举报