差分學習筆記

2022-05-11 13:55:20 字數 2674 閱讀 4820

題面傳送門

首先明確,這是一道差分裸題,不要被它的藍標籤嚇到。

演算法簡介:差分是一種和字首和類似的資料結構,畢竟在差分過程中要進行字首和,所以字首和是差分的基礎。差分能做到\(o(1)\)修改,但要\(o(n)\)查詢,適用範圍不如字首和。差分適合查詢極少,修改大大多於查詢的題目。

演算法實現: 首先我們定義差分陣列s與基本陣列a。

修改:我們要讓\(x=5\),\(y=9\)區間內加上\(z=5\),那麼我們有乙個方法:\(f_x+=z;f_-=z\);

0 0 0 0 5 0 0 0 0 0 -5 0 0 0

查詢:那我們要查詢\(x=5\),\(y=9\)區間,怎麼辦呢?因為字首和是差分的基礎,所以先做一遍字首和。

0 0 0 0 5 5 5 5 5 5 0 0 0 0

那麼原陣列就出來了。

那怎麼查詢呢?再做一遍字首和唄!

0 0 0 0 5 10 15 20 25 25 25 25 25 25

再按照字首和用\(a_y-a_=25-0=25\)即得答案。

按照字首和的思路,二維差分怎麼辦?怎麼修改\(x1=2\),\(y1=5\)到\(x2=4\),\(y2=7\)使其加上\(z=5\)?

首先根據套路,\(a_\)肯定要修改,那剩餘怎麼辦?怎麼推?

0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 5 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0

那先做一遍字首和吧!

0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 5 5 5 5 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0

做到這裡時不對了,\(a_\)不應該有數值,所以在\(a_\)上放乙個\(-z\)。

0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 5 5 5 0 0 0 0 0 0 0

0 0 0 0 5 5 5 0 0 0 0 0 0 0

0 0 0 0 5 5 5 0 0 0 0 0 0 0

0 0 0 0 5 0 0 0 0 0 0 0 0 0

又不對了,\(a_\)不應該有數值,所以還要在\(a_\)上放乙個\(-z\)

0 0 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 5 5 5 0 0 0 0 0 0 0

0 0 0 0 5 5 5 0 0 0 0 0 0 0

0 0 0 0 5 5 5 0 0 0 0 0 0 0

0 0 0 0 0 0 0 -5 0 0 0 0 0 0

但\(a_\)不應該有負數啊,所以亡羊補牢地在\(a_\)補上乙個\(z\)。

所以二維差分修改就是:

\(a_+=z\)

\(a_-=z\)

\(a_=z\)

\(a_+=z\)

有感覺和字首和有點相似。

兩個基礎資料結構都指向了同乙個數學模型:韋恩圖!

那麼對於這道題,只要列舉錘子的長和寬再列舉每乙個點進行二維差分就好了。

個人理解: 差分陣列的修改是個很好的方法,但它的代價是複雜的查詢。若有其他東西來維護差分陣列的查詢就很好了。

**實現:

#include#includeusing namespace std;

int n,m,a[239][239],b[239][239];

int main()

for(i=n;i>=1;i--)

} if(flag) r=mid;

else l=mid;

} if(l==m) printf("0");

else printf("-1\n%d",r);

return 0;

}

學習筆記 關於差分

本篇參考 顧z dalao的講解。現講一下差分陣列的定義吧。a i n j 1 b j 幾個栗子 原陣列1,3,5,2,4。差分陣列1,2,2,3,2。那麼這個陣列有什麼優勢呢?如果我們要在原陣列中修改一段區間的值,假如是給l到r這段區間加上x,那麼它在差分陣列中的體現就是 b l x,b r 1 ...

差分約束學習筆記

以 luogu p5960 為例。n 個未知數,m 組形如 x i x j le y k 的不等式,求可行解。對於每乙個 x i 我們都能找到 a 組關於它的不等式,第 j 形如為 x i x le y therefore x i le min x y x y x y 該不等式取等時 x i min...

12 20 差分約束學習筆記

先來看一組不等式 x1 x2 0 x1 x5 1 x2 x5 1 x3 x1 5 x4 x1 4 x4 x3 1 x5 x3 3 x5 x4 3 在不等式組 1 中,每個不等式都是兩個未知數的差小於等於某個常數 大於等於也可以,因 為左右乘以 1 就可以化成小於等於 這樣的不等式組就稱作 差分約束系...