蓝桥杯ACwing习题

https://www.acwing.com/problem/content/4648/

// 解析

// ai ^ aj = x
// => aj = x ^ ai

// 首先  l <= i && <= r
// j <= l && j >= r
// 选择一个 i  对应的 j 要在 l 到 r 区间 还需要满足异或的条件 
// 那么就是 f[i] <= l && f[i] <= r
// 如果 i < l 的话 那么 f[i] 一定是没有答案的 
// 所以说 i 可以扩大到  1 <= i <= r 
// 那么题意就变为在 1--r中选择一个数 i 使得 f[i] 满足 异或的条件 
// 那么我们只需要预处理出 f[r] >= l 是否存在即可
// 预处理出每一个 i 前面所有满足条件的f[i]

#include
#include
#include

using namespace std;

const int N = 100010 , M = 1 << 20;

int f[N] , a[N];
int n , m , x;
int last[M];

int main()
{
    cin >> n >> m >> x;
    
    for(int i = 1 ; i <= n ; i ++)
    {
        int a;
        cin >> a;
        f[i] = max(f[i - 1] , last[x ^ a]); 
        // f[i] 存的是最大的存在下标 
        last[a] = i;
    }
    // 1 2 3 4
    while (m -- )
    {
        int l , r;
        cin >> l >> r;
        if(f[r] >= l) puts("yes"); // f[r] 一定小于 r 因为在更新的时候 last[a] = i 是在后面更新的
        else puts("no");
    }
    
    return 0;
}
 

你可能感兴趣的:(蓝桥杯,算法,职场和发展)