codeforces-#687-D
十一月 27, 2020
题意
给出一个长度为1e5d 非递减数列, 每个数ai<1e9
现在给出一种操作:
选择两个连续的数 异或后替换进去
如[2,5,6,8] 选择(5,6) 得到[2,3,8]
问最小需要几次操作才能使得打破原来数列的非递减性质
或者输出-1表示不可能
题解
同样 位运算相关问题一定要想到 按位运算的性质
我们发现 在题目所给的非递减数列中
当且仅当 存在三个连续的 数 他们的most significant bit 在同一位上时
才能通过异或后两个数 打破原来的非递减性质
那么由于数列非递减 所以超过60个数并且要保证ai的值一定小于1e9
只能至少存在三个连续的数 他们的most significant bit 在同一位上
例如
00..001x
00..001x
00..01xx
00..01xx
…
1xxxxxx
1xxxxxx
60个数是两个连续最高位在同一位上且ai不超过1e9的情况
于是当n>60时 只用异或1次就能 达到目的
题目的量级一下缩小到n=60 以下 可以直接暴力枚举
n在60以下时 只有两个 相邻区间
它俩内的数求异或和 记为A和B
这两个数A>B是才能打破非递减性质
1 |
|
查看评论