給出乙個無向圖,q次詢問,每次詢問給出兩個點(x,y),求包含x,y的總大小不低於z的聯通塊(可能x,y不在乙個聯通塊中),使得聯通塊中的邊的序號最大值盡可能小。
好久沒寫整體二分了。。。
這裡順便複習一下:
對詢問和答案同時二分,每次判斷答案中間值後,把詢問歸為左右兩類,使得每一層的時間複雜度均攤下來是o(n)級別的。
檢查用並查集就行了
#include
#include
#include
#include
#define sf scanf
#define pf printf
#define maxn 100010
using namespace std;
struct queryque[maxn],tmp[maxn];
pair link[maxn];
int ans[maxn];
int fa[22][maxn],siz[22][maxn];
int get_fa(int dep,int
x)void add_edge(int l,int r,int dep)
}}int count(int dep,int
x,int
y,int sz)
void solve(int l,int r,int ql,int qr,int dep)
int mid=(l+r)>>1;
add_edge(l,mid,dep);
int tl=ql,tr=qr;
for(int i=ql;i<=qr;i++)
for(int i=ql;i<=qr;i++)
que[i]=tmp[i];
add_edge(mid+1,r,dep);
solve(l,mid,ql,tr,dep+1);
solve(mid+1,r,tl,qr,dep+1);
}int main()
solve(1,m,1,q,0);
for(int i=1;i<=q;i++)
pf("%d\n",ans[i]);
}
整體二分專題
何謂整體二分?一般的二分只適用於單個詢問的,如果有很多個詢問,就變成了n 2n 2 n2或更高但整體二分則可以迅速處理多個詢問的問題 首先需要離線,讀入所有詢問 然後我們二分答案,這時候我們將詢問分成兩個部分,如果l r就直接更新答案,否則考慮分治,詢問的答案在左邊的丟到左邊,答案在右邊的則丟到右邊...
學習 整體二分
在?看看整體二分 整體二分是個啥,就是遞迴進行二分答案的操作,按照當前二分出的區間對詢問操作和修改操作進行左右分類。有點類似於歸併排序的樣子,但是需要用個維護區間的資料結構來維護當前詢問區間的區間的查詢和修改操作,每次查詢完當前區間的操作之後,需要清空之前的修改操作。整體二分可以保證會互相影響的操作...
整體二分總結
通常與 cdq 分治同類談論,處理的問題性質本質上有不同 整體二分,顯然整體 同時 處理多個二分查詢,通常帶有修改,我們需要分治處理 solve l,r,l,r 為操作 l,r 中答案均在 l,r 區間內 我們是分治處理 l,mid 操作的前 n 個為新增操作 靜態陣列 掃一遍操作,新增操作時把 v...