CF1665E MinimizOR 题解

发布时间 2024-01-06 08:23:26作者: Pengzt

CF1665E

直接做不是很好下手,考虑找些性质。

有一个比较显然的贪心,就是按位从高到低的考虑,如果当前位至少有 \(2\)\(0\),就可以去掉该位为 \(1\) 的数。但是时间上显然是不行的。

假如没有重复的数,可以发现扫到最后一位时,剩下的数的数量是 \(\log V\) 的,证明省去。

于是我们就可以大胆的猜一个结论:对答案可能会产生贡献的数不超过 \(1+\log V\) 个,且一定是最小的 \(1+\log V\) 个。

最小是显然的。\(\log V\) 可以通过刚刚的贪心感性理解一下,严谨的证明可以使用数学归纳法。不妨令 \(V=\max\{a_i\}=2^k\)

显然,\(k=1\) 时是成立的。

考虑 \(k>1\) 的情况。

若第 \(k\) 位有 \(\ge 2\)\(0\),那么这一位最后肯定为 \(0\),即在前 \(k\) 位中找 \(\min\),也就是 \(k-1\) 个数。

若第 \(k\) 位没有 \(0\),那这一位一定是一,第 \(k\) 位已经没有影响,还是 \(k\) 个数。

否则,考虑前 \(k-1\) 位时可能不需要第 \(k\) 位为 \(0\) 的数,故 \(k+1\) 个数。

所以我们只需求出区间的前 \(\min(31,r-l+1)\) 小的所有数,然后暴力求解即可,求出这些数可以用线段树。

时间复杂度:\(\mathcal{O}(q\log n\log V+q\log^2V)\)