模板: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

相关文章
相关标签/搜索