真-毒瘤题
Links there:BZOJ3065
题意
如题,强制在线,带修改,带插入的区间 $k$ 小值的查询
思路
不带插入是可以带修主席树直接做的 不带插入的右转 BZOJ1901
这个插入的操作十分的令人恶心 我们要多维护一个区间顺序的信息了
脑海里回顾一下学过的毒瘤的数据结构 似乎只有平衡树能搞这个东西了
所以我们用替罪羊树套主席树!
Treap?Splay?插入的时候要rotate太难写!
我们用暴力重构的Scapegoat!
不用旋转 思维比较简单 实现难度低 代码量小 绝对是非可持久化平衡树的首选啊
每次暴力重构的时间是 $O(nlog^2n)$ 每个点期望重构次数是严格小于 $logn$ 次的所以总复杂度小于等于 $O(nlog^3n)$
再考虑一下询问 这里是要把每个结点对应区间的节点作为一个向量拉出来 对于向量跑二分.
二分复杂度 $logn$ 每次询问寻找复杂度 $logn$ 所以询问的复杂度为 $O(qlog^2n)$
还有没有优化的余地呢 ?
答案是肯定的 对于 $N$ 个权值区域相同的主席树合并可以做到 $O(nlogn)$
每次暴力重构的复杂度可以通过权值线段树的合并做到 $O(nlog^2n)$
这样最后的复杂度是 $O((n+q) \times log^2n)$ 的但是因为暴力重构的次数实际上并不多 因此这个优化实质上也不明显
注意垃圾回收! 垃圾回收一定不要写挂! (这就是我调一个上午的理由)
Code
1 | //What is broken can be reforged. |