『正睿OI 2019SC Day2』

<更新提示>

<第一次更新>


<正文>

分治

普通分治

普通分治是指针对序列或平面问题的分治算法。

思想

普通分治的思想是指将一个序列问题或平面问题通过某种划分方式划分为若干个子问题,直到子问题规模足够小,可以直接回答,再通过合并得到原问题的解。

通常来说,我们划分的方式是某个与题目特征有关的值,例如最大值或最小值。而当不易使用特征值进行划分的时候,我们也可以直接使用中点来划分,以保证时间复杂度,再设法计算贡献。

重要例题和简要题解

\(1.\) 求序列所有子区间的最大值之和:利用最大值进行划分,计算每一个最大值的贡献即可。

\(2.\) 求序列所有子区间的最大值最小值乘积之和:利用中点划分,讨论最大最小值和中点的相对位置关系,预处理计算贡献即可。

\(3.\) 求序列所有子区间的\(gcd\)之和:发现\(gcd\)只有不超过\(log\)种取值,利用中点划分,分段计算贡献即可。

整体分治

整体分治指的是在带若干个询问,修改的动态问题中,对所有询问整体二分答案的分治算法。

思想

整体分治会对多个操作同时进行二分答案,再通过操作分类的方式,得到子问题,再向下递归求解,直到值域区间足够小,可以直接回答询问。

其精髓在于整体上的二分答案,以及询问的分类操作。当问题还带有修改操作时,我们还需对修改操作进行分类,这就需要根据操作的影响来分类,还需要用数据结构记录影响。

重要例题和简要题解

\(1.\) k大数查询:对所有操作进行整体分治,对于一个询问,根据比\(mid\)值大的数的个数进行分类,对于一个添加操作,就看添加的数是否大于\(mid\)来计算影响,进行分类。

CDQ分治

\(CDQ\)分治指的是针对时间划分来计算修改操作影响的分治算法。

思想

形式化的,\(CDQ\)分治用来解决偏序问题,核心思想就是每次分治通过部分有序的特征化简偏序限制,回答询问,计算影响,再进行归并排序。其关键在于如何抽象出其偏序的关键字,来进行分治,还有影响以及询问的计算。

更一般的,\(CDQ\)分治可以在偏序问题中顶替一层数据结构,在动态问题中可以利用时间分治的技巧转动态为静态,是一种使用范围较广,比较广义的分治算法。

重要例题和简要题解

\(1.\) 陌上花开:三维偏序模板题,可以先排序一维,\(cdq\)分治维护一维,树状数组维护一维来统计答案。

\(2.\) 好朋友的题:矩阵和用二维前缀和拆一下,拆成\(4\)个不同贡献的询问,然后\(cdq\)分治维护修改的影响和计算答案即可。

点分治

点分治指的是树上利用重心作为划分点,进行统计的分治算法。

思想

点分治是对树上有关信息进行统计的算法,其划分在于每一次选取树的重心,统计有关重心的答案,然后再删除重心,将树分为若干个不同的子树,递归处理。

而点分治的关键在于如何快速对有关重心的答案进行统计,通常来说会分为两种方法:\(1.\) 用数据结构维护统计 \(2.\) 用单调性和尺取法统计。而在使用第二种方法的时候,又会涉及到同一棵子树内的答案,需要我们重新计算容斥掉,这就在于具体的处理。

重要例题和简要题解

\(1.\) 求所有边数小于等于\(L\)的链的长度之和:每一次以重心分治,用尺取法统计答案,用树状数组维护长度和,相同子树内的答案要容斥掉。


<后记>

猜你喜欢

转载自www.cnblogs.com/Parsnip/p/11267090.html