二进制警报器
我们希望在线解决如下形式的问题:
给定长度为 的数组和 次操作,每次操作如下:
- 给数组一个位置加 。
- 给定不超过 个位置,要求在数组这些位置的总和超过 的时候输出该操作的编号。
众所周知,折半警报器能在均摊做到 ( 表示操作一复杂度为 ,操作二复杂度为 )。但我发现了一个 的算法,我们就称其为 "二进制警报器" 吧。
对于一个二操作,设其对应位置为 。对于该操作,维护一个阈值 ,只要 的值经过( 的时候,我们认为它经过了 ) 的倍数时 "报警"。如果目前的 能让所有 在都不报警的前提下总和超过 ,那么将 降低 。
对于每个 ,报警次数总和是不超过 的: 降到 时, 应是 的;而一个元素报警两次时,它必然增加了至少 。
对每个 开个 vector
维护警报器并利用二进制优化修改时找报警器的复杂度,复杂度是 。
这个结构能对我目前看到的所有减半警报器题目做出优化:
- 2019-2020 ICPC Asia Hong Kong Regional Contest I:直接的应用,能做到 。
- THUPC 2021 鬼街:直接的应用,能做到 。
- 300iq Contest 2 F:把
vector
改成链表,结合启发式合并可以做到 。 - 2022 CCPC Mianyang Onsite B:这题要难优化一些。考虑直接建线段树,然后将每个人的需求拆到线段树的节点上。这样能做到修改 ,但是查询要 。考虑平衡复杂度,把线段树的二叉改成 叉,并对线段树的每个儿子区间都维护其总和。这样我们就能将每个人的需求拆到 个点上了,而一次修改只会修改 个节点。总复杂度 。
- EZEC Round 12 F:和上一题类似,建立多叉树平衡复杂度,。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话