1 条题解
-
0
自动搬运
来自洛谷,原作者为

critnos
咔菲好喝。搬运于
2025-08-24 22:43:55,当前版本为作者最后更新于2022-11-14 21:11:40,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
,。
显然该问题不弱于区间加区间 rank,考虑 做法。
对值域 为底数分块,即块为 ,每块维护值域在该块内的数,共有 块。
取常数 ,令 ,则共有 块。 即 块。
容易发现,每次存在三种情形:
- 不变
- 被减去 ,但所属块不变
- 被减去 ,所属块变
显然,对于 所属的块会发生三种情形。该块内的数显然经过 次情形 后就会发生情形 。对于每个数会发生 次情形 ,那么会发生 次情形 。
对小于 的块只会发生情形 ,忽略。对大于 的块会发生情形 。
对块维护线段树,可以识别三种情形的发生。
那么问题其实是:
- 次单点修改(情形 )
- 次区间 rank(查询)
- 次区间减(情形 )
我们希望做到 ,那么操作 需要 。
对序列分块,块长为 。每次单点修改累计在一个块内,用另一个数据结构用同样的分块结构进行维护,直到该块内有 次单点修改就对原块进行重构。
用线段树上分散层叠维护,这是 well-known 的。单点修改用另一个数据结构维护时需要抵消原数贡献。另一个数据结构中每块有 个数,每 次修改重构该块,同样用线段树上分散层叠维护,修改时间复杂度 ,查询时间复杂度 ,重构单块次数为 ,所以重构时间复杂度为 。这里大小为 的分块起到了缓存的作用。
时间复杂度 ,取 即可 。
于是我们解决了问题,甚至在线线性空间。
实际实现使用的是平凡的二分做法,时间复杂度 ,因为分散层叠的常数会和 相乘,大概不能要了,二分反而能微调块长。
- 1
信息
- ID
- 8165
- 时间
- 1000~20000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者