复杂分治
分治是什么
分治一般会将某集中操作按某一标准(时间,取值,......)划分为两个部分,按同样思路计算这两个部分的答案,然后再计算这两个部分之间的相互影响(一般为单方面)
1.CDQ分治(基于时间的分治)
这一类问题一般基于某一初始状态的数据结构(一般为序列),进行若干次操作(分为修改与查询),每一次查询的操作基于初始状态及之前的每一次修改操作。
我们设计一个函数solve(l,r)为仅看l到r这些操作最后产生的答案,计算方法:
1.mid=(l+r)>>1,递归计算solve(l,mid),solve(mid+1,r);
2.计算l~mid中每一个change对mid+1~r中每一个query的影响
对于2来说,我们一般可以按某一顺序将前后两个部分排序使用双指针的方法去进行前者累计对每一个后者的影响,前者累计一般可以使用数据结构(如树状数组,线段树)来维护
例题P4093 记录
2.整体二分(基于值域的二分)
对于普通的二分答案,我们只能每次去寻找答案在左区间还是右区间
那多次询问捏?
一个道理,不过我们改成每一次有哪几个询问答案在左区间,哪几个在右就行了
当然,有时我们要根据原数据转移询问的区间来更改相应的询问
例题P3527 记录
3.线段树分治
等会儿再写