分治算法

CDQ分治:

中心思想:

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

整体二分:

中心思想:

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

具体做法:

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

对时间分治:

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

注意:

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

posted @ 2019-03-23 09:46  Smeow  阅读(194)  评论(0编辑  收藏  举报