CDQ分治的巢狀

2022-03-29 00:37:13 字數 859 閱讀 3787

簡單地說,有的問題,如果用一重cdq來分治乙個維度後,在合併時,還無法僅借助一層資料結構(如樹狀陣列)來計算左區間對右區間元素的影響。那這時,我們可以選擇再用一重cdq來分治下一維度,達到再降維的效果。

hdu上的一道題,stars。

題意三維空間下,有兩種操作,1.加入乙個點;2.查詢當前指定長方體空間內含多少個點。

思路**

#include#define dd(x) cout<<#x<<" = "typedef priority_queuebq;

typedef priority_queue,greater> sq;

const int maxn=5e4+10,mod=1e9+7,inf=0x3f3f3f3f;

int fwk[maxn<<1];

void upd(int p,int c)

int qry(int p)

struct node

;node p[maxn<<3],tmp[maxn<<3],tmp2[maxn<<3];

int ans[maxn],id,v[maxn<<1],tot,cnt;

inline void read(int x,int y,int z,int id=0,int ty=0)

inline int hs(int x)

void cdq2(int l,int r)

else

v[++tot]=z1;

} sort(v+1,v+1+tot);

cdq1(1,cnt);

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

printf("%d\n",ans[i]);

} return 0;

}

總結

CDQ分治概述

log l og 的時間把它變成離線問題。正好有些題目的離線問題是比較簡單的。具體是什麼意思呢?我們對於每一層分治,只考慮前一半對於後一半的影響,然後在每個詢問當中記錄下來影響。最後把所有影響合併就可以得到每乙個詢問的答案。舉個例子 區間修改區間查詢。首先,在時間軸上離線分治。每一層分治後把詢問和查...

CDQ分治總結

cdq這個東西嘛,說容易其實也很容易,說難其實也有些難,但只要細細品味,定能發現其中的真理的!那真理,也會像蝴蝶一般,破蛹而出,化身為一道亮麗的風景線。題記。咳咳,閒話就講到這裡了,切入正題。首先我們來了解一下cdq分治這個東東。cdq分治,他的常數小,但必須離線操作the most importa...

cdq分治小結

一般的分治,眾所周知的,是通過將大的問題拆小,然後對小問題的答案進行合併得到大問題的答案,但是cdq分治不是。我們知道,分治時,將乙個區間從中間斬開,分兩半處理,cdq分治在處理完之後,不是合併答案,而是計算左區間對右區間的貢獻,這樣子可以將維度降低,問題就更好做了。現在有 n nn 個二元組,每個...