P4117

先考虑如果修改操作是对整个序列进行的应该怎么做。

我们发现这个时候相当于对一个可重集合做这些操作,不妨认为有一个数组 \(ar[i]\) 表示 \(i\) 出现的次数。

这时询问是简单的,考虑怎么修改。发现倘若当前的值域是 \([0,mx]\),执行一次参数为 \(x\) 的操作后,我们可以分类讨论:

  • \(x > \frac{mx}{2}\),暴力执行操作,值域变为 \([0,mx-x]\)

  • \(x \leq \frac{mx}{2}\),不妨将下面那一部分合并到上面来,再打一个标记记录,值域变为 \([x,mx]\),实际上也是 \([0,mx-x]\)

综上,每次执行操作时值域都会减小,而值域最大只有 \(O(V)\),所以这个算法复杂度为 \(O(n+m+V)\)

下面考虑原问题。

我们要处理对一个区间做这样的操作。显然可以分块,分成 \(S\) 块,对整块采用如上的方法,对散块暴力重构。

发现修改时散块暴力重构势能不会增加,而总势能为 \(O(SV)\)

所以复杂度为 \(O(n+SV+\frac{n}{S}m)\),当 \(S=\sqrt{n}\) 时可以取到 \(O((V+m)\sqrt{n}+n)\)

然而这题卡空间,只有 \(64 \text{MB}\),我们上述算法的空间复杂度也是 \(O(V\sqrt{n})\) 的,显然无法通过。

考虑离线下来,对每一块分别计算。这样空间复杂度降到 \(O(n+m+V)\),时间复杂度不变,应该可以通过(等我写完)。

posted @ 2023-02-21 16:54  PYD1  阅读(16)  评论(0)    收藏  举报