CF2147E

给定 \(n\) 个数和 \(q\) 次查询,每次查询给定 \(k\),问最多进行 \(k\) 次以下操作后 \(n\) 个数按位或的 popcount 最大值。
操作是将某个 \(a_i++\)

\(ans_i\) 表示使得 \(popcount \ge i\) 至少需要几次操作,显然 \(ans_i\) 单调不降。询问只用找到最大的 \(i\) 使得 \(ans_i \le k\) 即可。

于是问题转化为求每个 \(ans_i\)。不难发现操作一定是在 \(s\)\(s\)\(n\) 个数或起来的和)的基础上将末尾的一段变为 \(1\),否则肯定可以使用更少的次数将更低的一个 \(0\) 变为 \(1\)。不妨设这一段为第 \(0 \sim j\) 位。

如果从低到高枚举每一位,其实 \(a_u\) 的更高位改变会影响低位的决策,所以从高到底依次枚举第 \(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 + q \log V)\)

因为从低到高考虑寄了很多发。

posted @ 2025-10-14 20:10  xiehanrui0817  阅读(19)  评论(0)    收藏  举报