题意

给你和区间,求与区间中的数异或后的最大值是多少。

题解

考虑什么样的数与异或会最大呢,那么直接贪心的考虑,就是的二进制位下0的地方是1,1的地方是0这样就能保证结果是最大的。
由于题目范围最大是,所以我们需要用无符号整型或者longlong来进行操作,我们从第31位开始遍历,若该位上,那我们需要和他异或的那个数就应该这位上是1,还需要判断一下若该数加上这位是1的话会不会超过上界,若不超过就加上。若该位是1的话,我们要异或的这个数就得是0了,但是还需要考虑下界,由于有下界的限制,若该位不是1的话,有可能后续位上都填上1,也会使得该异或的数任小于下界,所以我们判断一下若当该异或的数,即后续都是1的时候仍小于的话必须该位是1。即。两种情况都判断完了就可以写出代码了。

复杂度

时间复杂度为
空间复杂度为

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    unsigned int n, L, R, ans;
    while (t--)
    {
        scanf("%u%u%u",&n,&L,&R);
        ans = 0U;
        for (int i = 31; i >= 0; -- i) {
            if ((1U<<i)&n) {
                if (ans + (1U<<i) <= L) {
                    ans = ans + (1U<<i);
                }
            }else {
                if (ans + (1U<<i) <= R) {
                    ans = ans + (1U<<i);
                }
            }
        }
        printf("%u\n",ans^n);
    }
    return 0;
}