CF2119E And Constraint
题目大意:
有一个长度为 \(n\) 的序列 \(b\) 和一个长为 \(n - 1\) 的序列 \(a\),现在要求 \(b_{i} \& b_{i - 1} = a_{i}\)。
你也可以改变 \(b\) 数组,就是每次选择一个 \(1 \le i \le n\) 的 \(b_{i}\),让他加一。
最少要进行多少次操作,无解输出 -1。
\(n \le 10^5, a, b < 2^{29}\)
解题思路:
设最终的序列为 \(c\)。
那么我们不难发现一个必要条件:\(c_{i} \& (a_{i} | a_{i + 1}) = a_{i} | a_{i + 1}\) 且 \(c_{i} \ge b_{i}\)。
我们肯定希望在满足这个的条件下 \(c_{i} - b_{i}\) 的和尽可能地小。
由于他要求的是相与起来恰好是 \(a_{i}\),所以我们的 \(c_{i}\) 得往上调来避免这个问题。
由于我们的 \(c_{i} \& c_{i - 1}\) 要尽可能地小,所以我们不难发现这样的 \(c_{i}\) 最多有 log 种情况。
那么我们就可以设 dp 了,转移时间复杂度 \(O(n \log^2 V)\)。
感觉这个题虽然自己 0.7h 做出来了,但像这种对于每个位置都有类似 "尽可能大” 和 “尽可能小” 这种有点对立的条件,我们可以先满足一条条件,然后再去解决第二条。

浙公网安备 33010602011771号