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 做出来了,但像这种对于每个位置都有类似 "尽可能大” 和 “尽可能小” 这种有点对立的条件,我们可以先满足一条条件,然后再去解决第二条。

posted @ 2025-08-16 00:01  positive_deviation  阅读(9)  评论(0)    收藏  举报