容均摊

容均摊

记信息复杂度的代表量为“容”,容的变化次数与时间消耗有关。

容比势能更加直观,有时能更直接地证明均摊复杂度。

一般的维护方式:容变化时暴力处理,容不变时简单维护。

task 1(Luogu 花神游历各国 加强版)

维护长为 \(n\) 的非负整数序列 \(a\),支持 \(m\) 次操作:单点修改、区间开根(向下取整)、区间求和。

solution:

考虑一个数经过 \(O(\log\log V)\) 次修改必定变为 \(0/1\),于是设 \(i\) 的容为 \(a_i\),它的操作数为 \(O(\log\log a_i)\)

构建线段树,则一个线段树结点的容为其区间内叶子的容的集合,它的操作数为区间内叶子的操作数之和。

考虑修改影响:单点修改会改变 \(O(\log n)\) 个结点的容,对总操作数的增量为 \(O(\log n\log\log V)\)

再考虑线段树结构的时间复杂度,显然是 \(O(n+m\log n)\)

故总时间复杂度为 \(O((n+m)\log n\log\log V)\)

task 2(LOJ 市场)

维护长为 \(n\) 的整数序列 \(a\),支持 \(m\) 次操作:区间加、区间 \(/d \ (d\geq2,d\in N)\)(下取整)、区间求 \(\min\)、区间求和。

solution:

设线段树结点的容为它的区间的极差。

区间 \(/d\) 会使极差减半(但有向下取整的误差),那么仅需 \(O(\log V)\) 次操作就能将极差缩小至 \([0,1]\)。此时若极差不变,则将改为区间加(或对 \(\max,\min\) 分别维护),否则暴力递归。

初始的总操作数为 \(O(n\log V)\)

考虑区间加对容的影响:有 \(O(\log n)\) 个相交但不包含的结点,它们的容会变化,对总操作数的增量为 \(O(\log n\log V)\)

故总操作数为 \(O(n\log V+m\log n\log V)\)。而线段树结构的时间复杂度为 \(O(n+m\log n)\),那么总时间复杂度为 \(O(n\log V+m\log n\log V)\)

task 3(UOJ 数据结构基础练习题)

维护长为 \(n\) 的整数序列 \(a\),支持 \(m\) 次操作:区间加、区间开根(下取整)、区间求和。

分析同 task 2。

2025.9.28

posted @ 2025-10-10 14:21  FirCone  阅读(23)  评论(3)    收藏  举报