說是學習筆記,但是迄今為止也只a了模板,主要是沒找到cdq的題目,以後遇到了慢慢補吧。
cdq看起來難,說來也簡單。
將區間內的符合某種條件的數,分為經過中點(從左區間到右區間)的數,再分割為兩個更小的區間。
給個圖吧:
一般用作處理區間內滿足條件的三元對,二元對問題。
一般處理區間時會排序,故時間複雜度為\(o(\sum_^ }*log_ len_)<=o(\sum_^ len_*log_ n)=o(n n}^)\)
模板:三維偏序
第一維排序,第二維cdq,第三維樹狀陣列。
#includeusing namespace std;
const int n=1e5+7,m=2e5+7;
int n,m=0,k,t,v[n],x[m];
struct xdp[n],q[n];
inline int read()
while(ch>='0'&&ch<='9') t=(t<<3)+(t<<1)+(ch-48),ch=getchar();
return f*t;
}bool cmp(xd u,xd v)
for(int i=l;i
}int main()
cdq(1,m);
for(int i=1;i<=m;++i) v[q[i].e+q[i].d-1]+=q[i].d;
for(int i=0;i
return 0;
}
CDQ分治學習筆記
今天學了一下cdq分治,感覺這東西真的挺好用的,趕緊寫點東西怕以後再忘咯 其實類似於cdq分治的東西在oi早期學排序的時候就應該學過,那就是歸併排序 歸併排序的原理和cdq分治大體一樣,先劃分成兩個區間,遞迴解決兩邊,再合併起來 並且用歸併排序求逆序對的時候本質上就是在解決乙個二維偏序的問題 首先回...
CDQ分治 學習筆記
對於每個 查詢 操作,其結果ans i 1,i 1 ans i 1,i 1 ans i 1,i 1 中所有修改對其造成影響的疊加 這裡的 疊加 需要能夠比較方便的維護,例如sum min max sum min max sum mi n ma x等 定義s ol ve l r solve l,r s...
cdq分治學習筆記
0xff 學習cdq分治的前置知識 分治 歸併排序 分治 分治,字面上的解釋是 分而治之 就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題 直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。度娘 歸併排序 歸併排序是普通分治的一種基本應用。將排序序列分...