一种O(nlogn)+O(1)+O(nlogn)的、通过对分治树的预处理、可以支持无修改树上路径、区间问题的算法
无论能不能重复贡献、能不能具有可减性,只要具有结合律并且可以快速合并(只用合并一次),并且预处理时空消耗不大,
对于许多组询问的问题有很大的优势。
由ImmortalCO喵提出。
对于序列和区间查询
预处理:开始先分治时候预处理当前区间每个点到mid的前缀/后缀信息
查询:先长度变成2^k,LCA就是叶子编号的LCP,可以x>>log2[x^y]求出。O(1)定位,然后利用预处理信息合并一次即可。
相较于线段树省略了划分成logn区间再合并的麻烦。
相较于前缀和可以处理不可减信息(如gcd)
相较于RMQ可以处理不能重复贡献(如最大子段和)问题
树上
其实这和动态点分治思想异曲同工
可以预处理到logn分治重心路径的信息。
分治树LCA用ST表预处理O(1)查询
然后直接定位之后查询即可了。
之所以消掉了logn,因为预处理使得区间、路径可以O(1)拼凑在一起。
通过分治树的结构搞事情。