思维题配套题解
CF79D Password
你有 \(n\) 个灯泡,一开始都未点亮。
同时你有 \(l\) 个长度,分别为 \(a_1 \sim a_l\)。
每次你可以选择一段连续的子序列,且长度为某个 \(a_i\),并将这些灯泡的明灭状态取反。
求最少的操作次数,使得最后有且仅有 \(k\) 个位置是亮的,这些位置已经给定,为 \(x_1 \sim x_k\)。
Hint
- 考虑逆向思维
- 考虑差分
- 考虑状压
题解:
- 逆向思维:把一个序列化为 \(0\)。
- 差分数列:把区间求改化为 \(O(1)\)
现在题目是,桌子上有 \(k\) 个石子,每次可以把位于 \(x\) 的石子移到 \(x+l_i\),如果 \(x+l_i\) 有石头,那么两个石头抵消。问操作最少次数。
因为要把石子消掉,现在开始匹配,比如样例
下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
差分 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
现在我们可以选 \((1,4),(5,10)\)。
因为 \(k \le 10\),所以差分数组里最最最多也就 \(20\) 个 \(1\)。
直接算出 \(i-j\) 配对所用的最少次数。之后在用 \(dp[i]\) 算出已经抵消了 \(i\) 在 \(2\) 进制下的所有位的最小代价。