分治算法

CDQ分治:

中心思想:

按照偏序(时间可以作为偏序)分治,不断递归处理前一半元素对后一半元素的贡献,这样把问题转成了一个个先插入后修改的子问题,把动态修改问题转成静态问题(常常在每一层处理的时候用对询问(或修改)排序等方式消掉原本动态修改不能消掉的限制,再静态解决)。

整体二分:

中心思想:

单次询问要满足可二分性,但是(check)复杂的很高,而且可以在预处理完后复杂度很低的单次判断,从而可以把所有询问一起二分,得到答案。

具体做法:

((l,r))表示答案(输出结果)的范围,((L,R))表示答案在((l,r))范围内的询问的范围。每次二分答案,把所有((L,R))中的询问都(check)一遍,判断是在左区间还是右区间。

对时间分治:

按照时间分治,先把操作都变成有一个存活的时间区间,然后在时间结构上区间修改,最后遍历时间结构并修改,遍历到叶子结点(时间点)时信息便是当时的,询问即可。

注意:

分治的时候先递归,再归并排序,少一个(log),对所有操作都排序,在开始的时候记一下(wz),就可以统计(mid)前对(mid)后的操作了。

原文地址:https://www.cnblogs.com/Smeow/p/10582633.html