专栏文章

题解:P7603 [THUPC2021] 鬼街

P7603题解参与者 66已保存评论 77

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
77 条
当前快照
1 份
快照标识符
@miqiwt5o
此快照首次捕获于
2025/12/04 05:32
3 个月前
此快照最后确认于
2025/12/04 05:32
3 个月前
查看原文
我们希望在线解决如下形式的问题:
给定长度为 nn 的数组和 qq 次操作,每次操作如下:
  • 给数组一个位置加 vv
  • 给定不超过 kk 个位置,要求在数组这些位置的总和超过 vv 的时候输出该操作的编号。
这题就是 k=ω(n)k = \omega(n) 的版本。
众所周知,折半警报器能在均摊做到 O(1)O(k2logqlogV)\mathcal O(1) - \mathcal O(k^2\log q\log V)xyx - y 表示操作一复杂度为 xx,操作二复杂度为 yy)。但我发现了一个 O(1)O(klogV)\mathcal O(1) - \mathcal O(k\log V) 的算法,我们就称其为 "二进制警报器" 吧。
对于一个二操作,设其对应位置为 pos1,...,posdpos_1,...,pos_d。对于该操作,维护一个阈值 hh,只要 aposia_{pos_i} 的值经过(axax+wa_x \to a_x+w 的时候,我们认为它经过了 (ax,ax+w](a_x,a_x+w]2h2^h 的倍数时 "报警"。如果目前的 hh 能让所有 aposia_{pos_i} 在都不报警的前提下总和超过 vv,那么将 hh 降低 11
对于每个 h=h0h=h_0,报警次数总和是不超过 O(k)\mathcal O(k) 的:hh 降到 h0h_0 时,vi=1kaposiv - \sum_{i=1}^{k}a_{pos_i} 应是 O(k2h0)\mathcal O(k2^{h_0}) 的;而一个元素报警两次时,它必然增加了至少 2h02^{h_0}
对每个 (位置,h)(\text{位置},h) 开个 vector 维护警报器并利用二进制优化修改时找报警器的复杂度,复杂度是 O(1)O(klogV)\mathcal O(1) - \mathcal O(k\log V)
对于这题,复杂度为 O(n+qω(n)logV)\mathcal O(n + q\omega(n)\log V)

评论

77 条评论,欢迎与作者交流。

正在加载评论...