题意简述
你得到了一个包含 $n$ 个非负整数的数组。
你需要回答 $q$ 个独立的询问。在第 $i$ 个询问中,你最多可以执行 $b_i$ 次以下操作:
选择数组中的一个元素并将其增加 $1$。
你的目标是最大化数组中所有数字的 按位或(bitwise OR) 结果中等于 $1$ 的位数。对于每个询问,求出这个最大值。
思路分析
首先把所有数字按位或起来,得到一个初始的 $\text{sum}$。记它的二进制表示中有 $\text{base}$ 个 $1$。
接下来所有的操作,最终得到的结果一定都不小于 $\text{base}$,因为那不如不操作。
所以我们目标是尽可能多地把 $\text{sum}$ 的二进制表示中的 $0$ 给填成 $1$。
从最低位开始填一定不劣。
记 $\text{cost}_i$ 表示使 $\text{sum}$ 的最低的 $i$ 位均为 $1$ 所需的操作次数。
如果 $\text{sum}$ 的第 $i$ 位为 $1$,那么我们什么都不需要做, $\text{cost}i=\text{cost}{i-1}$。
否则就需要选择一个数 $A_j$,将其增加 $k$,使得 $A_j+k$ 的第 $i$ 位为 $1$。
为了使操作代价 $k$ 最小,我们应该选择一个 $A_j$,使 $A_j+k$ 恰好等于 $A_j$ 的前 $i$ 位清空且第 $i$ 位为 $1$。
所以最小代价 $k$ 即为 $(\lfloor\dfrac{A_j}{2^{i+1}}\rfloor\cdot2^{i+1}+2^i)-A_j$.
换个写法,就是 $k=2^i-(A_j \bmod2^i)$。
这个式子看着唬人,实际上直接建一个 $\text{mask}$ 往上一 $\operatorname{And}$ 以下就可以了。
每一次都扫一遍即可。