THUPC2021 鬼街

Day \(\text{M}_r(\text{O}_2)\)

这东西原来叫减半报警器??

首先这题肯定和数论没啥关系,因为 \(10^5\) 之内的 \(\max \omega(n)=6\),即一个数至多只有 \(6\) 个质因子。

然后我们发现如果 \(x\)\(k\) 个不同的质因子,这 \(k\) 个质因子代表的房子内闹鬼总次数达到了 \(y\),那么至少有一个房子内闹鬼次数达到 \(\left\lceil y/k\right\rceil\)。换而言之,检测房子闹鬼次数达到 \(\left\lceil y/k\right\rceil\) 就是报警的必要条件

那么我们把每个报警器 \((x,y)\) 拆分成更小的报警器:

  • \(x\)\(k\) 个不同质因子 \(d\) 代表的房子上安装一个阈值为 \(t=\left\lceil y/k\right\rceil+s_d\) 的小报警器 \((d,t)\)\(s_d\) 为目前房子 \(d\) 的闹鬼次数,当闹鬼总次数达到 \(t\) 时激活小报警器。
  • 在每一个房子 \(d\) 处用一个小根堆来维护这个房子所有的小报警器 \((d,t)\),按照阈值 \(t\) 从小到大排序。当这栋房子闹鬼时,就可以从小到大找到所有阈值不超过总闹鬼次数的报警器。
  • 一旦有一个 \((d,t)\) 小报警器被触发,意味着其所在的报警器可能已经报警了,直接暴力检查;如果没有报警,对应报警器的所有小报警器 \((d',t')\) 重新分配阈值 \(t'=\left\lceil (y-(s_d-t))/k\right\rceil+s_{d'}\)

不难发现以上的分配方案下,一个报警器至多被重新分配 \(\log_{6/5} y\) 次。

复杂度 \(O(\omega(n)m\log m\log_{6/5}y)\)

posted @ 2023-10-10 18:38  Ender_32k  阅读(77)  评论(0编辑  收藏  举报