减半警报器
首次出现应该在 2019-2020 ICPC Asia Hong Kong Regional Contest I. Incoming Asteroids
考虑如下问题:
有 \(n\) 个位置,\(m\) 个警报器,每个警报器监测比较少的几个位置(大概是常数级别),警报器在某一时刻开启后,如果监测的几个位置发生的事件(每个事件只在比较少的几个位置发生)阈值总和大于警报器的阈值,就报警(警报器开启前发生的事件不会对警报器造成影响,每个警报器只报警一次)。
减半警报器可以做到 \(\log^2\),zak 提出的二进制警报器可以做到单 \(\log\)。
减半警报器
把每个警报器单独拿出来看:
设现在有一个警报器报警阈值为 \(y\),总共监测 \(k\) 个位置。根据鸽笼原理,警报器想要报警,那么他所监测的某一个位置的阈值一定大于等于 \(\left\lceil \frac{y}{k} \right\rceil\)。考虑将一个大的警报器分散成几个小的警报器监测某一个位置。注意到警报器监测的位置比较少,因此修改考虑可以暴力维护。
然后每一个位置存一个当前总共发生过的事件阈值总和 \(\texttt{tag}\),用一个可删堆维护当前位置所有的小警报器即可。如何消除之前发生过的事件的影响:插入大警报器时差分一下即可。小警报器报警就大力重构大警报器即可。
时间复杂度:注意到每次小警报器报警一个大警报器的阈值至少会下降 \(\left\lceil \frac{y}{k} \right\rceil\),重构次数一定小于 \(\log_{\frac{k}{k-1}} y\),加上可删堆的一只 \(\log\) 总体复杂度一般为 \(\mathcal{O}(n \log m \log V)\)。
例题:
P7603 [THUPC 2021] 鬼街
GYM102452I. Incoming Asteroids
以上都可以利用 zak 的二进制警报器优化到单 \(\log\)。
二进制警报器
Todo.

浙公网安备 33010602011771号