Loading

E2. Eliminating Balls With Merging (Hard Version)

\(\text{solution}\)

就是考虑这样一个过程,我对于一个数 \(a_i\),我先二分一下左边,再二分一下右边,看能不能取,具体区间取 \(\max\) 可以用 ST 表,不能发现这样的一种方法绝对是唯一的。

考虑如果是 E1,那么这样子直接做就完了,仔细分析一下复杂度,发现我们的总次数似乎是一个 \(2\) 的次幂在值域内的个数,这个东西是 \(\log\) 的,每次二分一个 \(\log\),那么就是一个双 \(\log\)

然后我们考虑 E2 咋做,我们考虑每次 \(x\) 加一时我们让加的范围触到区间边界的数继续扩展再二分,但是这样做是 \(O(n^2\log^2n)\) 的。

考虑优化,不难发现按照 E1 的二分过程,我们其实一个数 \(a_i\) 只会向右拓展 \(\log\) 个连续段,但是我们发现无法实时的维护左端点扩展的信息,咋办呢?

我们发现左端点的扩展信息其实是不那么重要的,就是我们可以先把右端点扩展完再扩展左端点,我们发现其实是对每个数的 \(\log\) 个向右的连续段每段进行二分(为啥要分段二分,因为我们下一个右端点的扩展需要靠当前的这一段所供给的左端点扩展长度,比较难理解),二分到了啥时候我的当前区间值就不能覆盖整个区间了。但是我们二分左端点扩展到哪时又要二分,这样就是三只 \(\log\) 的了,非常的不优美。

我们发现此时我们可以对于每个前缀二分出至少当前区间总值为多少才能覆盖整个前缀,这样的预处理复杂度是两只 \(\log\) 的,然后我们具体计算的时候直接比大小就好了。

posted @ 2024-08-30 21:51  Alexande  阅读(34)  评论(0)    收藏  举报