前缀和差分 精讲(一维、二维、附例题!)
這篇文章是我尋找眾多博客總結歸納的,還有找到的部分經典例題,相信看完的你一定會有新的感悟!加油!
一、一維前綴和
一維的前綴和數組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)的正方形面積:
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:
再將二維數組求前綴和即得到變換后的數組;
對上述公式的解釋:
只是將點(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(逃~~
總結
以上是生活随笔為你收集整理的前缀和差分 精讲(一维、二维、附例题!)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: an error occurred wh
- 下一篇: 【Tensorflow 报错】struc