这道题目其实我们如果位运算的题目有取值范围的话(这道题目的\([x,y]\)),我们可以统计公共前缀
首先对于一个数对\((x_i,y_i)\)(假设\(x_i≠y_i\)),我们先统计他们的最长公共前缀
比如\(000110101\)和\(000111000\),他们的最长公共前缀就是\(000110000\)(位数都是\(32\)位,这里省略了,公共前缀之后的位用\(0\)补齐)
那么在最终的选择中,公共前缀这些位一定要是一样的(比如上面举的例子,低的四位不知道怎么填写,但是高的五位一定是\(00011\)),所以我们将\(x\)和\(y\)减去这个公共前缀再去考虑剩下的位
这个时候考虑区间\([l,r]\)的每一个数(仍然是从高位到低位逐位考虑),如果此时所有的\(y\)(减去了公共前缀的,下文都是)在这个位上都是\(0\),那么肯定没办法操作;如果只有一个\(y\)在这个位上是\(1\),那么我们再来考虑之前的那些公共前缀,如果存在某个公共前缀在这一位上是\(1\),那么肯定我们可以把这唯一的一个\(y\)在这个位上赋值为\(0\),然后把之后的位全部赋值成\(1\)(这个操作是可行的,因为我们最开始假设了\(xi≠y_i\),所以减去了公共前缀之后,新的\(y\)一定比新的\(x\)大至少\(1\))肯定是最优的,如果不存在这样的公共前缀,那么根据贪心,我们肯定是把这一个\(y\)的这一位赋值为\(1\);如果有两个及以上的\(y\)在这一位是\(1\),我们仍然可以将这一位及其之后的位全部变成\(1\)
代码有细节,见注释
标签:Distance,前缀,位上,MAC,减去,Learning,公共,我们,赋值 From: https://www.cnblogs.com/dingxingdi/p/18059429