日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

前缀和差分 精讲(一维、二维、附例题!)

發布時間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 前缀和差分 精讲(一维、二维、附例题!) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這篇文章是我尋找眾多博客總結歸納的,還有找到的部分經典例題,相信看完的你一定會有新的感悟!加油!

一、一維前綴和

一維的前綴和數組sum[ i ]就是存的是 前i個數的總和 。
那么x到y區間的總和就是 sum[ y ] - sum[ x ]

應用

1、求一個數前面的所有數的和:遞推;

2、求較多區間( l , r )之間的數的和:求前綴和之后 ans=a[r]-a[l-1];

例:HJ澆花、color the ball;

3、多組數據,每組數據都用同一總數組來操作,如果一組數據一組數據遍歷的話很容易超時,那么可以將那個總數組答案化(即,將該數組修改成接下來的每組數據需要的數),接著按輸入找數組就行了。

例:Olympiad;

4、將兩種不同的物品分離,求最少的操作次數:一種物品從前面取前綴和,另一種從后面取“后綴和”,遍歷所有點,總個數去掉兩個數組里數即為不符合的需要改動的個數。

例:戰馬列隊;

二、二維前綴和

二維的前綴和如sum[ i ][ j ]是指 (i,j)點的左上角的矩陣(從(1,1)開始)的各數總和。

求二維前綴和的方法:

a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1];

以下是對該式子的解釋:

如圖:圖一點(i,j)的意義:紅色區域的面積;假設其周圍的數已求出前綴和,那么(i,j-1)點就是圖二黃色區域的面積,(i-1,j)就是圖三藍色區域的面積。那(i,j)的求法是圖一整個紅色區域去點黃色和藍色區域?不,多加了綠色區域,還要去掉綠色區域;
即:a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1];

應用可以快速的求出矩陣中任何一個子矩陣的和,如:
1、求長為l且右下角頂點為(i,j)的正方形面積:

sum[i][j] - sum[i][j-l] - sum[i-l][j] + sum[i-l][j-l]

2、求左上角為(x1,y1),右下角為(x2,y2)的矩形的面積:

sum[x2,y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];

前提:矩陣中的所有的數已求前綴和;
我們要算的是 D區域 (以(x1,y1)為左上角,(x2,y2)為右下角的矩形) 的面積,那么sum[x2,y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1]即總的面積去掉A+B的面積去掉A+C的面積,多減了一個A的面積,再加上。

例:激光炸彈,最大正方形,Conturbatio。

三、一維差分

可以簡單理解為:“相鄰兩個數之差”;
差分就是數組b對于數組a有b[ i ] = a[ i ] - a[ i-1 ](2 <= i <= n),b就是a的差分。
性質:差分的前綴和是原數組,前綴和的差分也是原數組(差分是前綴和的逆狀態;
應用:給定多個區間,將區間里的所有數相加或相減一個數。如果挨個區間遍歷的話,很可能超時,那么可以用差分
例如 將區間(l,r)中的所有的數+1,將所有數差分后,a[l]++,a[r+1]--; 再求前綴和即為變換后的區間;

例:fancy的區間、最高的牛、增減序列;

四、二維差分

根據二維前綴和表示的是右上角矩形的和,由于差分只涉及前面相鄰的數(由一維可以推出),并且由前面范圍的數相加得到這個位置的數。那么類比二維前綴和和一維差分,可以簡單推測出二維差分的公式:

f[i][[j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1];

(二維差分就是二維前綴和的逆運算,所以與正好二維前綴和公式相反。)

性質

  • 二位前綴和通過二維差分后變換成原數組;
  • 二維差分通過二維前綴和后也會變成原數組;
  • 如何從差分矩陣得到原矩陣呢?
    a[i][j]=f[i][j]+f[i-1][j]+f[i][j-1]-f[i-1][j-1]; (即前綴和公式);
    應用:將所給矩形中的所有的數加上一個數或減掉一個數
    例:將以(x1,y1)為左上角,以(x2,y2)為右下角的矩形中的所有的數+c:

    f[x1][y1]+=c; f[x1][y2+1]-=c; f[x2+1][y1]-=c; f[x2+1][y2+1]+=c;

    再將二維數組求前綴和即得到變換后的數組;
    對上述公式的解釋:

  • 前提:數組已二維差分;
  • 如圖:我們的目的是將圖一紫色矩形中的所有數字+c,在一維差分中,區間中的數加減只需對邊界操作,二維差分也是如此。
    只是將點(x1,y1)+c后會影響到全部的區域(即圖二黃色區域,原因:之后要取前綴和),為了消除影響,則要(x1,y2+1)-c,(即圖三藍色區域),(x2+1,y1)-c(即圖四藍色區域),會發現有重復部分,去掉重復:(x2+1,y2+1)+c;
  • 模板:二維差分模板——差分矩陣;

    例題:方格稿紙

    參考來源:
    https://blog.csdn.net/Zeolim/article/details/86770827
    https://blog.csdn.net/mrcrack/article/details/99701435
    https://blog.csdn.net/justidle/article/details/104506724

    本蒻第一次寫博客hh,肯定有不足的地方,歡迎各位大佬前來指正!

    如果覺得還不錯就鼓勵一下吧hh(逃~~

    總結

    以上是生活随笔為你收集整理的前缀和差分 精讲(一维、二维、附例题!)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。