CDQ分治總結

2021-09-05 09:47:16 字數 3168 閱讀 2178

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的序列,讓你求著逆序對個數。

sample input:

31 2 3

sample output:

0100%:n<=5*10^5

這題很簡單吧,樹狀陣列或是歸併排序(就是cdq分治的基本使用)。

先來個樹狀陣列的:

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