模板:CDQ分治 HiHoCoder1513:小Hi的煩惱:http://www.cnblogs.com/luyouqi233/p/8705620.html BZOJ3295:[Cqoi2011]動態

UPD:18.06.15修正一些錯誤,感謝評論區巨佬orzhtml

CDQ分治不是一個顧名思義的東西,CDQ分治是爲了記念神犇陳丹琦而命名的一種算法。算法

那麼CDQ分治能幹什麼?CDQ分治主要是用來解決一類」操做獨立且容許離線「的數據結構題。編程

(固然要是不能離線的話就樹套樹吧……)數據結構

(PS:其實有」撤銷某次操做「也是能夠用CDQ分治作的,可是我菜,因此不作討論。)post

——————————————url

算法描述:

再次重申CDQ必須知足的條件:spa

1.修改操做對詢問的貢獻獨立,修改操做之間互不影響效果。htm

2.題目容許使用離線算法。blog

而後咱們正式開始CDQ分治。排序

首先咱們對詢問和修改隊列二分,咱們就能發現:

1.後半隊列對前半隊列的操做無影響。

2.後半隊列中的詢問僅受前半隊列操做和它以前的後半隊列的操做。

首先對於前半隊列,由1可知它沒有任何限制,那咱們就遞歸之。

對於後半隊列,明顯後半隊列的修改操做不受前面操做的影響。

那麼對於後半隊列的詢問操做,由2可知該問題徹底被轉化爲了「給定一些操做後進行詢問」的靜態離線問題,這樣極大地下降了咱們的編程難度。咱們設這個操做的複雜度爲O(f(n))。

而咱們所搜的深度爲O(logn),因此時間複雜度爲O(f(n)logn)。

————————————————————————

用法:

有關於CDQ的問題絕大部分均可以轉化爲三維偏序問題。

所謂偏序問題,一般問比一個點「小」的點有多少個,其中「小」的定義由點自己的性質決定(一般狀況下定義當前點的個項性質都大於另外一個點,則該點更大)。

而三維偏序問題,就是指這樣的一個點的性質一共有三個。

咱們的想法是:先排序解決一維(而後將該維度看爲查詢/修改的時間),而後再CDQ解決二維,最後數據結構解決三維。

這種思惟在下面的例題中都有所體現。

至於更高維度的問題,咱們能夠雙重甚至多重CDQ解決(固然樹套樹套樹……?),可是因爲編寫更加困難,因此採用玄學的bitset解決問題。

好比這道題:

HiHoCoder1513:小Hi的煩惱:http://www.cnblogs.com/luyouqi233/p/8705620.html

————————————————————————

例題:

BZOJ3262:陌上花開 & 洛谷3810:三維偏序http://www.cnblogs.com/luyouqi233/p/8039450.html

BZOJ1176:[Balkan2007]Mokia:http://www.cnblogs.com/luyouqi233/p/8043237.html

BZOJ3295:[Cqoi2011]動態逆序對:http://www.cnblogs.com/luyouqi233/p/8044201.html

BZOJ2716:[Violet 3]天使玩偶:http://www.cnblogs.com/luyouqi233/p/8046555.html

相關文章
相關標籤/搜索