cdq(陳丹琦)分治是一種特殊的分治方法。
cdq分治在維護一些動態的凸包、半平面交問題也有一定應用,然而本渣渣並不會。
cdq分治基於時間分治,整體二分基於答案分治。
1:將操作按照某個關鍵字排序
2;算出[l,mid]對[mid+1,r]的貢獻
3;遞迴處理[l,mid]和[mid+1,r]
注:這裡的區間指的是操作區間。
題目必須滿足「修改獨立,允許離線」兩個條件。
這樣的話我們把操作區間二分
會發現後一半的修改操作對前一半的詢問操作不會產生影響
前後兩個區間的聯絡只是前一半的修改操作會影響後一半的詢問操作。
這個東西我們是可以事先算出來的:對於在滿足某種限制下的答案貢獻進行合併
用cdq分治可以解決多維偏序問題
你有乙個長度為n的棋盤,每個格仔內有乙個整數
兩種操作:
1 x a 將格仔x裡的數字加上a
2 x y輸出x y 這個區間內的數字和
1<=n<=100000,運算元不超過10000個,記憶體限制128m。
是不是很水啊。。。
幾個做法
我們對x公升序排序,然後按照時間分治,分治的時候記錄乙個字首和
我們要保證貢獻的計算不重不漏,根據上面的思路,是不是非常簡單啊。。。
#include#include#define maxn 100001using namespace std;
int s[maxn],n,m,tot,t,sum,ans[maxn];
struct dataq[maxn*2],tmp[maxn*2];
int read()
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}bool cmp(const data &x,const data &y)
for(int i=l;i<=r;i++)
sum=0;
for(int i=l;i<=r;i++) q[i]=tmp[i];
slove(l,mid),slove(mid+1,r);
return ;
}int main()
}sort(q+1,q+tot+1,cmp);
slove(1,tot);
for(int i=1;i<=t;i++) printf("%d\n",ans[i]);
return 0;
}
bzoj 2683簡單題
學習筆記 CDQ分治
分治,考慮前一半對後一半的影響。和一般分治不太相同的思想是,一般分治不分誰對誰的影響,跨mid的都要統計。全域性變數統計 而cdq貌似要落腳到前一半對後一半的影響上,也就是貢獻在後一半統計,由前一半產生。大概使用情況 1.三維偏序 2.優化dp 3.這個裡面有。注意處理三維情況的巧妙性。heoi20...
學習筆記 CDQ分治
聽娜姐講完fft,一臉懵逼,還是來講講 cdq分治 吧。解決 帶時間軸的更改和查詢 問題。首先我們要知道,這個演算法是離線的,還是利用遞迴進行求解的。把讀入的n個操作都按照時間軸排列好。把時間軸劈開,分為 l,mid 和 mid 1,r 兩部分。開始當前層cdq l,r 的求解前先進行cdq l,m...
CDQ分治學習筆記
今天學了一下cdq分治,感覺這東西真的挺好用的,趕緊寫點東西怕以後再忘咯 其實類似於cdq分治的東西在oi早期學排序的時候就應該學過,那就是歸併排序 歸併排序的原理和cdq分治大體一樣,先劃分成兩個區間,遞迴解決兩邊,再合併起來 並且用歸併排序求逆序對的時候本質上就是在解決乙個二維偏序的問題 首先回...