给定 \(n\) 个数和 \(q\) 次查询,每次查询给定 \(k\),问最多进行 \(k\) 次以下操作后 \(n\) 个数按位或的 popcount
最大值。
令 \(ans_i\) 表示使得 \(popcount \ge i\) 至少需要几次操作,显然 \(ans_i\) 单调不降。询问只用找到最大的 \(i\) 使得 \(ans_i \le k\) 即可。
于是问题转化为求每个 \(ans_i\)。不难发现操作一定是在 \(s\) (\(s\) 为 \(n\) 个数或起来的和)的基础上将末尾的一段变为 \(1\),否则肯定可以使用更少的次数将更低的一个 \(0\) 变为 \(1\)。不妨设这一段为第 \(0 \sim j\) 位。
如果从低到高枚举每一位,其实更低位改变会影响高位的决策,所以从高到底依次枚举第 \(k\) 位。
- 如果这一位现在有 \(1\) 个数在第 \(k\) 位为 \(1\),就不用管了。
- 否则,找到 \(a_u \% 2^k\) 最大的 \(k\),花费 \(2^k - a_u \% 2^k\) 的代价将 \(a_u\) 的第 \(k\) 位变成 \(1\),第 \(0 \sim k - 1\) 位变成 \(0\)。证明:若存在一个 \(a_v \% 2^k < a_u \% 2^k\) 的 \(v\) 更优,其实等价于将 \(a_v\) 加到 \(a_u\),在操作 \(a_u\)。
时间复杂度:\(O(n \log^2 V)\)。