Distance Learning Courses in MAC
这道题目其实我们如果位运算的题目有取值范围的话(这道题目的\([x,y]\)),我们可以统计公共前缀
首先对于一个数对\((x_i,y_i)\)(假设\(x_i≠y_i\)),我们先统计他们的最长公共前缀
比如\(000110101\)和\(000111000\),他们的最长公共前缀就是\(000110000\)(位数都是\(32\)位,这里省略了,公共前缀之后的位用\(0\)补齐)
那么在最终的选择中,公共前缀这些位一定要是一样的(比如上面举的例子,低的四位不知道怎么填写,但是高的五位一定是\(00011\)),所以我们将\(x\)和\(y\)减去这个公共前缀再去考虑剩下的位
这个时候考虑区间\([l,r]\)的每一个数(仍然是从高位到低位逐位考虑),如果此时所有的\(y\)(减去了公共前缀的,下文都是)在这个位上都是\(0\),那么肯定没办法操作(此时所有\([l,r]\)的课程都还处于公共前缀,没办法操作);如果只有一个\(y\)在这个位上是\(1\)(即当前考虑的这一位刚好有一个课程刚好跳出最长公共前缀),那么我们再来考虑除了当前课程的公共前缀,如果存在某个公共前缀在这一位上是\(1\),那么肯定我们可以把这唯一的一个\(y\)在这个位上赋值为\(0\),然后把之后的位全部赋值成\(1\)(这个操作是可行的,因为这一个位置刚好是这个\(y\)跳出最长公共前缀的时候,也就是说\(y\)的这一位为\(1\),\(x\)的这一位为\(0\),由于我们赋的值在当前位为\(1\),所以小于\(y\),而后面的值都是\(1\),所以不小于\(x\))肯定是最优的,如果不存在这样的公共前缀,那么根据贪心,我们肯定是把这一个\(y\)的这一位赋值为\(1\);如果有两个及以上的\(y\)在这一位是\(1\),我们仍然可以将这一位及其之后的位全部变成\(1\)
代码有细节,见注释
update 2024.7.18
重新做一遍这道题目,做出来啦
关键还是考虑最长公共前缀