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

cyffff
Not yet for the story on the last page, it's not the end.搬运于
2025-08-24 22:44:59,当前版本为作者最后更新于2023-02-14 21:59:16,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题意
有 个序列 ,有一个常数 ,初始时每个序列中有一个 。对于序列 ,定义 表示最小的满足 的 。有 次操作,有两种操作:
- 对 ,在序列 前端加入一个数 ;
- 查询 。
对每个 操作输出答案。
,。
思路
区间查询差分成 两处的前缀查询。
考虑一个非常神秘的扫描线,对于第 个操作(记作时刻 的操作),如果是修改,在 处插入 , 处删除 ,并支持动态查询 时刻的,当前前缀的答案。
考虑设扫到 ,现在集合内所有点对按 排序,就是 最终的形态(反过来),对于 , 时刻的答案就是找到 在集合中的前驱 ,往前连乘多少个会大于 ,记作 。记 分别表示存在于集合内的 的前驱与后继,则 之间的答案都是 。
考虑涉及乘法,我们会想到把 和 分开计算。我们对每个 的 维护 之间有多少个 ,记为 。注意到最后被插入的若干个 是没有算入的,这个在开头写一个区间加一,区间推平为零,区间求和的线段树 即可。
现在集合里只维护了 的操作,可以发现,只用乘 个数就会超过 ,把这些乘到的结点的 加起来就是此处的 。
我们需要维护一个答案序列 , 为当前前缀在时刻 的答案总和。对集合里每个结点也维护 表示对答案序列区间 还有 的贡献没计入。查询时找到查询时刻 的前驱,取出其 值并加上 即为所求。
我们不能对每个序列 都遍历整个集合并将 加入 中。对于一些 没有改变的结点,我们记录上一次加入答案的时刻 (指最后在扫到 这个序列时加入过),注意到 不变,则在序列 更新 值的时候需要把 增大 ,更新 。
在 发生改变时,我们需要把 贡献到答案序列中,即将区间 加 ,将 置零,需要支持的是单点查询,维护区间加单点求值的树状数组 即可。
考虑把 插入到 和 之间。我们需要先把 贡献到答案序列中,更新 的 ,还要更新 ,这需要查询 间的 的个数,写个单点加区间求和树状数组 即可。
考虑删除 ,设 ,我们先把 贡献到答案序列中,改变 的 ,把 加上 即可。
所述集合可以用平衡树(
set)简单维护,其实是维护了一个支持随机插入的链表。时间复杂度是 。
需要代码的还是私信吧。
再见 qwq~
- 1
信息
- ID
- 8244
- 时间
- 2500ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者