时间分治(又叫cdq分治),是解决一类“贡献独立”、“支持离线”的数据结构问题的算法。
假设有一个操作序列:ABAABAABBAAAB,其中每个A对其后面的B有一定贡献,要求输出每个B对应的答案。
“贡献独立”是指:每个A对其后面的B的影响是不受其他A影响的,即是要我们用B前面的所有A更新过B,那么B的答案就是正确的。
贡献独立的例子:max,min,sum,count(极值,和,满足某种条件的A的个数)。
“支持离线”是指每个AB必须开始时就给出,有些问题(如维护凸壳优化DP),可能A和B是合在一起的,即受前面的东西影响,得到答案后再影响后面的东西,这个东西也可以做(虽然一开始它没有告诉我们每个对后面的影响是什么)。
这样我们就可以将上面的问题变为:AAAABBBB的问题,这样我们就可以根据前面所有的A预处理出一些信息,然后去更新后面的B(主要)。
整体二分:解决一些询问具有二分性的问题,但如果单个询问都去二分,那么为了一个询问有可能就需要进行一次预处理,时间不允许。
整体二分就是共用一些预处理,然后同时二分所有询问,难点就在于共用什么信息以及怎么实现。