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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

這篇文章是我尋找眾多博客總結(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)的正方形面積:

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];

前提:矩陣中的所有的數(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ì)

  • 二位前綴和通過二維差分后變換成原數(shù)組;
  • 二維差分通過二維前綴和后也會(huì)變成原數(shù)組;
  • 如何從差分矩陣得到原矩陣呢?
    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:

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

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

  • 前提:數(shù)組已二維差分;
  • 如圖:我們的目的是將圖一紫色矩形中的所有數(shù)字+c,在一維差分中,區(qū)間中的數(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。