cdq這個東西嘛,說容易其實也很容易,說難其實也有些難,但只要細細品味,定能發現其中的真理的!那真理,也會像蝴蝶一般,破蛹而出,化身為一道亮麗的風景線。 ——題記。
咳咳,閒話就講到這裡了,切入正題。
首先我們來了解一下cdq分治這個東東。
cdq分治,他的常數小,但必須離線操作the most important!
然後,講講cdq的答題思路。
first,分。將[l,r]分成[l,mid]和[mid+1,r](mid=l+r>>1)
then,入。進入兩區間,直至l==r才return
after that,求。求[l,mid]區間對[mid+1,r]的貢獻。
ok,下面來講講例題,這樣才能懂吧。。。
1:裸的cdq——逆序對統計(一維偏序)
給出n,和長為n的序列,讓你求著逆序對個數。這題很簡單吧,樹狀陣列或是歸併排序(就是cdq分治的基本使用)。sample input:
31 2 3
sample output:
0100%:n<=5*10^5
先來個樹狀陣列的:
#include
#include
#define ll long long
#define lowbit(x) x&-x
#define n 500010
using namespace std;
struct nodea[n]
;ll ans=
0,t[n]
=,c[n]
;int n,tot=1;
inline
intread()
intcmp
(node x,node y)
void
add(
int x)
ll total
(int x)
intmain()
;sort
(a+1
,a+n+
1,cmp)
;c[a[1]
.num]=1
;for
(int i=
2;i<=n;i++
)for
(int i=n;i>
0;i--
)add
(c[i]
),ans+
=total
(c[i]-1
);printf
("%lld\n"
,ans)
;return0;
}
再來一段cdq分治(也就是歸併)的。
#include
using namespace std;
int n,a[
500010
],b[
500010];
long
long ans=0;
inline
intread()
void
cdq(
int l,
int r)
while
(le<=mid) b[now++
]=a[le++];
while
(ri<=r) b[now++
]=a[ri++];
for(
int i=l;i<=r;i++
) a[i]
=b[i];}
intmain()
2:裸的cdq——二維偏序
給出n,以及n對(x,y)真的,這道題其實也很簡單的。求對於每一對(x,y)共有多少(x1,y1)滿足x>=x1&y>=y1
n<=10^5
一維排序,另一維cdq分治即可。
#include
#include
using namespace std;
struct nodea[
100010
],b[
100010];
int n,c[
100010];
inline
intread()
intcmp
(node x,node y)
void
cdq(
int l,
int r)
while
(le<=mid) b[now++
]=a[le++];
while
(ri<=r) b[now++
]=a[ri++];
for(
int i=l;i<=r;i++
) a[i]
=b[i];}
intmain()
3:裸的cdq——陌上花開(三維偏序)
本題洛谷上有,可自己做一下。
對於這題,我們無語。。。。。。
自己手賤,打了個cdq套cdq。。。
一維排序,另外兩維就兩個cdq即可。
#include
#include
#include
#define maxn 100010
using namespace std;
int n,k,ans[maxn]
,d[maxn]
;struct node
}a[maxn]
,b[maxn]
,c[maxn]
;inline bool cmp
(const node &a,
const node &b)
inline
intread()
void
cdq2
(int l,
int r)
void
cdq(
int l,
int r)
intmain()
總的來說,cdq分治是可以學的!!! CDQ 分治總結
特別基礎的教程略。cdq 分治的優缺點 1 優點 量少,常數極小,可以降低處理維數。2 缺點 必須離線處理。cdq 分治與其他分治最本質的不同在於 分治到達 l,r 時,分治處理 l,mid 與 mid 1,r 然後遞迴上來合併的時候 只考慮 l,mid 中元素 對 mid 1,r 中元素的影響 看...
CDQ分治總結
目錄同步 經過了一周的划水,我終於搞懂了cdq分治。總的來說,cdq分治處理偏序問題就是 傳送門求靜態區域內的點數,二維偏序模板題。include includeconst int maxn 500000 5 5 x,y 橫縱座標 type 操作型別 add 求矩形區域面積用幾個矩形加加減減,所以a...
CDQ分治概述
log l og 的時間把它變成離線問題。正好有些題目的離線問題是比較簡單的。具體是什麼意思呢?我們對於每一層分治,只考慮前一半對於後一半的影響,然後在每個詢問當中記錄下來影響。最後把所有影響合併就可以得到每乙個詢問的答案。舉個例子 區間修改區間查詢。首先,在時間軸上離線分治。每一層分治後把詢問和查...