整體二分 學習筆記

2022-10-05 18:15:12 字數 1984 閱讀 8532

作者會把自己學習時遇到的一些疑問回答,盡量寫的詳細、合理,讓更多人能夠理解這個演算法。

顧名思義,整體二分是處理這樣一種問題:可以使用二分法解決,但是對於每乙個詢問都進行一次二分時間複雜度無法接受的問題。這時候,整體二分就誕生了:它先將所有操作讀入,然後進行乙個統一的二分,或者說:分治。因為是一次性處理所有詢問、修改,因此這種演算法被稱為:整體二分

先回憶一下普通二分的內容:當詢問和操作滿足單調性時,每次查詢乙個中間點與當前詢問作比較,決定是接著往哪個方向尋找。這樣子區間長度每次減半,時間複雜度是優秀的 \(o(\log_2n)\)。

拓展到整體二分上,我們相當於是同時對每乙個詢問查詢。每一次二分,我們會有乙個值域區間,乙個當前需要處理的操作序列。我們接著來比較每個操作以及中點 mid,也就是說,對於當前的值域區間,所有詢問操作會被分成兩個部分:目標在左區間的,以及目標在右區間的。而為了接著處理這些詢問,我們相當於是要接著分別處理兩個區間的詢問,一直遞迴下去。當然,如果左區間或者右區間沒有操作序列,那自然就不需要接著操作了,直接返回即可。如果當前值域只剩下乙個點了,也就是我們已經遞迴到終點了,直接存下答案即可。

具體實現的話,我們需要乙個 \(solve\) 函式,有四個引數:\(ql,qr,l,r\) ,分別表示當前操作序列的左右端點,以及當前值域的左右端點。操作序列之所以會有乙個區間,是因為處理操作時會把當前區間分成兩部分,為了方便就直接在當前區間分開,再遞迴處理下去。

應該能夠理解的吧qaq

p3834 【模板】可持久化線段樹 2

算是模板題吧。對於這種多個詢問並且詢問滿足單調性(第 k 小)的題目,就很適合整體二分。(其實帶修也能做。具體來說,就是我們把原數列每乙個位置當作一次修改,後面的就是查詢。處理乙個詢問的時候,我們想要得出乙個區間的第 k 小值與當前 mid 的關係,最常見的方法就是查詢當前區間小於等於 mid 的數的個數,與 k 比一下大小。具體可以用樹狀陣列實現。

#include #include #include #include #include #include #include using namespace std;

#define lb(x) (x&-(x))

#define mid (l+r>>1)

#define ll long long

const int n=2e5+2,m=1002,i=0x3f3f3f3f;

int read()

int n,m,cnt;

int ans[n];

struct _n

a[n<<1],b1[n<<1],b2[n<<1];

int c[n];

void add(int x,int y)

int p1=0,p2=0;

for(int i=ql;i<=qr;i++)

if(a[i].type==2)

}for(int i=ql;i<=qr;i++) if(a[i].type==1&&a[i].x<=mid) add(a[i].id,-1);

for(int i=1;i<=p1;i++) a[ql+i-1]=b1[i];

for(int i=1;i<=p2;i++) a[ql+p1+i-1]=b2[i];

solve(ql,ql+p1-1,l,mid);

solve(ql+p1,qr,mid+1,r);

}int main(); }

for(int i=1;i<=m;i++)

; }solve(1,cnt,-i,i);

for(int i=1;i<=m;i++) printf("%d\n",ans[i]);

return 0;

}

算是講完了吧qaq

以後如果有時間會講的更詳細,也會放一些例題。現在就先咕咕咕了。

這篇隨筆更多的是自己的學習體會,自己的學習筆記,可能寫的不是很好,也不要介意。

學習 整體二分

在?看看整體二分 整體二分是個啥,就是遞迴進行二分答案的操作,按照當前二分出的區間對詢問操作和修改操作進行左右分類。有點類似於歸併排序的樣子,但是需要用個維護區間的資料結構來維護當前詢問區間的區間的查詢和修改操作,每次查詢完當前區間的操作之後,需要清空之前的修改操作。整體二分可以保證會互相影響的操作...

整體二分 學習筆記 更新中

先小結一下吧 主要為個人理解 zyz 整體二分是在權值上進行 cdq 分治 我覺得更像是說 整體二分是在答案上進行 cdq 分治 整體二分是二分答案在資料結構題上的擴充套件 因為資料結構題二分的答案通常是第幾個操作之後,需要進行一些操作 預處理 之後才能判斷,所以每次詢問二分還不如從前往後暴力找 整...

cdq分治 整體二分 學習筆記

本部落格還是從二維偏序開始鋪墊,對cdq分治進行講解 實際上是給自己講,因為沒人看 前置知識 歸併排序 cdq分治的學習需要保證對歸併排序的理解,雖然它是乙個基礎演算法。給定 n 個元素,第 i 個元素有兩個屬性 a i 和 b i 設 f i 為滿足 a j leq a i,b j leq b i...