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解決問題。
好比這道題:
————————————————————————
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