題面傳送門
首先明確,這是一道差分裸題,不要被它的藍標籤嚇到。
演算法簡介:差分是一種和字首和類似的資料結構,畢竟在差分過程中要進行字首和,所以字首和是差分的基礎。差分能做到\(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 就可以化成小於等於 這樣的不等式組就稱作 差分約束系...