从昨天到现在除了90%的颓废时间一直在研究一些分治的姿势,主要就是CDQ分治和整体二分。
首先推荐一些学习资料:
陈丹琦 《从 < Cash > 谈一类分治算法的应用》
许昊然 《浅谈数据结构题的几个非经典解法》
百度一下就可以get
CDQ分治
CDQ分治的关键在于,每个子问题不仅是解决它自身,并且用前一个子问题来求解后一个子问题。常用来将一些动态的问题转化到静态来解决,使问题处理起来更加方便。
使用CDQ分治需要满足一定的条件:
- 题目允许离线操作
- 修改操作对询问的贡献独立,且修改之间互不影响
- 修改对答案的贡献是确定的,与判定标准无关
NOI2007货币兑换是一个用数据结构维护DP决策的问题,它满足CDQ分治的条件。BZOJ1176Mokia是一个在线用数据结构维护一些数据信息的问题,我们可以转为离线操作,简化操作。BZOJ3262陌上花开是一个用数据结构维护三维偏序的问题,我们可以用CDQ分治来替代一维数据结构,避免写树套树这种二维数据结构。
CDQ分治在维护一些动态的凸包、半平面交问题也有一定应用,然而我这个计算几何幼儿园水平的连静态半平面交都不会,以后再学吧。
整体二分
二分是OI中常用的一种思想,如果对于有多次修改和多次询问的且答案满足二分性的题目,我们可以每次都二分来做。不过如果修改的答案对询问的贡献独立且确定,我们如果求出了某一部分修改对答案的贡献,则这一部分的贡献是不会变的,我们以后的询问中要避免这种重复的操作。
所以我们可以从整体来把握问题,不仅对答案二分,对询问也进行二分。
使用整体二分需要满足的条件:
1. 题目允许离线操作
2. 修改操作对询问的贡献独立,且修改之间互不影响
3. 修改对答案的贡献是确定的,与判定标准无关
4. 答案具有二分性
可见应用CDQ分治和应用整体二分的条件是很相似的,其实都是按照时间分治的方法,只是整体二分多了一个二分答案的过程。
BZOJ1901和BZOJ2738矩阵乘法是两道关于
K
<script type="math/tex" id="MathJax-Element-23">K</script>小值的问题,应用整体二分可以避免写一些烦琐的数据结构。BZOJ2527Meteors也是一道整体二分的题目。
匆匆补完了CDQ分治和整体二分,xhr论文中还提到了一个叫做二进制分组的东西,在维护分治问题的时候要善于用树状数组。