整体二分 & CDQ 分治 学习笔记

整体二分

模板题

整体二分是基于二分的快速算法,用于求解答案允许二分,但是需要二分的对象过多而无法直接二分的问题。

这时候的解决方法是类似于线段树,递归计算很多个区间的答案,由于结构类似线段树,所以一共递归计算了 \(2n\) 次,为了保证复杂度,每次递归计算 \(l,r\) 这个区间的时候必须保证复杂度为区间长度(或加上 \(log\)、根号等),这样子就一共有 \(logn\) 层,每层仅计算 \(n\) 次,复杂度为 \(O(nlogn*区间运算复杂度)\)。必须必须保证区间运算的复杂度,否则就会退化到普通二分。

具体策略

假设当前计算区间 \(l,r\),需要计算 \(V\),那么求出一个 \(mid\)。这时候 \(V\) 中关于 \(1\)\(l-1\) 是算完了的,于是只需要计算 \(l\)\(mid\)(这是保证时间复杂度的重要措施),然后再统计 \(V\) 中哪些元素已经符合要求,放到 \(T1\) 中,另外的放到 \(T2\) 中,同时保存这次运算对 \(T2\) 中的元素的影响(为了使每次计算只需要运算 \(1\)\(mid\)),然后递归左半部分和右半部分即可。

CGQ 分治

模板题

将一个大问题分解为两个小问题,先算出来两个小问题的答案,再将两个小问题放一起,计算答案。计算各自答案时递归求解。

使用 CDQ 分治的要求是问题可以被分解、可以快速算出来两半儿之间的答案。


分治可以被运用在很多地方上,只要是在某一条件下,两块儿的内容必须各自计算,去掉这个条件后,又可以根据两边的答案(不根据也行)快速算出来和这个条件有关的答案,就可以,比如序列中人为不让两半的答案产生影响,再快速算出来左半部分与右半部分的影响;也可以是网格图中将中间的所有边割掉,使得两边互相不可达,然后再快速算出中间的边对两边的影响,参考题目:P3350 [ZJOI2016] 旅行者

posted @ 2024-01-26 12:25  cndark_moon  阅读(40)  评论(0)    收藏  举报