前缀和差分 精讲(一维、二维、附例题!)
這篇文章是我尋找眾多博客總結(jié)歸納的,還有找到的部分經(jīng)典例題,相信看完的你一定會(huì)有新的感悟!加油!
一、一維前綴和
一維的前綴和數(shù)組sum[ i ]就是存的是 前i個(gè)數(shù)的總和 。
那么x到y(tǒng)區(qū)間的總和就是 sum[ y ] - sum[ x ]
應(yīng)用:
1、求一個(gè)數(shù)前面的所有數(shù)的和:遞推;
2、求較多區(qū)間( l , r )之間的數(shù)的和:求前綴和之后 ans=a[r]-a[l-1];
例:HJ澆花、color the ball;
3、多組數(shù)據(jù),每組數(shù)據(jù)都用同一總數(shù)組來操作,如果一組數(shù)據(jù)一組數(shù)據(jù)遍歷的話很容易超時(shí),那么可以將那個(gè)總數(shù)組答案化(即,將該數(shù)組修改成接下來的每組數(shù)據(jù)需要的數(shù)),接著按輸入找數(shù)組就行了。
例:Olympiad;
4、將兩種不同的物品分離,求最少的操作次數(shù):一種物品從前面取前綴和,另一種從后面取“后綴和”,遍歷所有點(diǎn),總個(gè)數(shù)去掉兩個(gè)數(shù)組里數(shù)即為不符合的需要改動(dòng)的個(gè)數(shù)。
例:戰(zhàn)馬列隊(duì);
二、二維前綴和
二維的前綴和如sum[ i ][ j ]是指 (i,j)點(diǎn)的左上角的矩陣(從(1,1)開始)的各數(shù)總和。
求二維前綴和的方法:
a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1];以下是對(duì)該式子的解釋:
如圖:圖一點(diǎn)(i,j)的意義:紅色區(qū)域的面積;假設(shè)其周圍的數(shù)已求出前綴和,那么(i,j-1)點(diǎn)就是圖二黃色區(qū)域的面積,(i-1,j)就是圖三藍(lán)色區(qū)域的面積。那(i,j)的求法是圖一整個(gè)紅色區(qū)域去點(diǎn)黃色和藍(lán)色區(qū)域?不,多加了綠色區(qū)域,還要去掉綠色區(qū)域;
即:a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
應(yīng)用:可以快速的求出矩陣中任何一個(gè)子矩陣的和,如:
1、求長(zhǎng)為l且右下角頂點(diǎn)為(i,j)的正方形面積:
2、求左上角為(x1,y1),右下角為(x2,y2)的矩形的面積:
sum[x2,y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];前提:矩陣中的所有的數(shù)已求前綴和;
我們要算的是 D區(qū)域 (以(x1,y1)為左上角,(x2,y2)為右下角的矩形) 的面積,那么sum[x2,y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1]即總的面積去掉A+B的面積去掉A+C的面積,多減了一個(gè)A的面積,再加上。
例:激光炸彈,最大正方形,Conturbatio。
三、一維差分
可以簡(jiǎn)單理解為:“相鄰兩個(gè)數(shù)之差”;
差分就是數(shù)組b對(duì)于數(shù)組a有b[ i ] = a[ i ] - a[ i-1 ](2 <= i <= n),b就是a的差分。
性質(zhì):差分的前綴和是原數(shù)組,前綴和的差分也是原數(shù)組(差分是前綴和的逆狀態(tài);
應(yīng)用:給定多個(gè)區(qū)間,將區(qū)間里的所有數(shù)相加或相減一個(gè)數(shù)。如果挨個(gè)區(qū)間遍歷的話,很可能超時(shí),那么可以用差分:
例如 將區(qū)間(l,r)中的所有的數(shù)+1,將所有數(shù)差分后,a[l]++,a[r+1]--; 再求前綴和即為變換后的區(qū)間;
例:fancy的區(qū)間、最高的牛、增減序列;
四、二維差分
根據(jù)二維前綴和表示的是右上角矩形的和,由于差分只涉及前面相鄰的數(shù)(由一維可以推出),并且由前面范圍的數(shù)相加得到這個(gè)位置的數(shù)。那么類比二維前綴和和一維差分,可以簡(jiǎn)單推測(cè)出二維差分的公式:
f[i][[j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1];(二維差分就是二維前綴和的逆運(yùn)算,所以與正好二維前綴和公式相反。)
性質(zhì):
如何從差分矩陣得到原矩陣呢?
a[i][j]=f[i][j]+f[i-1][j]+f[i][j-1]-f[i-1][j-1]; (即前綴和公式);
應(yīng)用:將所給矩形中的所有的數(shù)加上一個(gè)數(shù)或減掉一個(gè)數(shù)。
例:將以(x1,y1)為左上角,以(x2,y2)為右下角的矩形中的所有的數(shù)+c:
再將二維數(shù)組求前綴和即得到變換后的數(shù)組;
對(duì)上述公式的解釋:
只是將點(diǎn)(x1,y1)+c后會(huì)影響到全部的區(qū)域(即圖二黃色區(qū)域,原因:之后要取前綴和),為了消除影響,則要(x1,y2+1)-c,(即圖三藍(lán)色區(qū)域),(x2+1,y1)-c(即圖四藍(lán)色區(qū)域),會(huì)發(fā)現(xiàn)有重復(fù)部分,去掉重復(fù):(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,肯定有不足的地方,歡迎各位大佬前來指正!
如果覺得還不錯(cuò)就鼓勵(lì)一下吧hh(逃~~
總結(jié)
以上是生活随笔為你收集整理的前缀和差分 精讲(一维、二维、附例题!)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: an error occurred wh
- 下一篇: 【Tensorflow 报错】struc