题目链接:https://www.lanqiao.cn/problems/2081/learning/
个人评价:难度 3 星
前置知识:异或运算
整体思路
定义数组 idx[num]
表示数字
n
u
m
num
num 的下标,定义 dp[i]
表示从第
1
1
1 个数字到第
i
i
i 个数字,所有满足
n
u
m
a
⊕
n
u
m
b
=
x
(
a
<
b
)
num_a \oplus num_b = x~(a<b)
numa⊕numb=x (a<b) 的数对中,
a
a
a 的最大值,递推式即为:
d p [ i ] = max ( d p [ i − 1 ] , i d x [ x ⊕ n u m i ] ) dp[i] = \max(dp[i-1],idx[x\oplus num_i]) dp[i]=max(dp[i−1],idx[x⊕numi])
注意以上为从第
i
i
i 个数字到第
n
n
n 个数字的递推式,遍历到第
i
i
i 个数字时,若前
i
−
1
i-1
i−1 个数字不存在
x
⊕
n
u
m
i
x\oplus num_i
x⊕numi,则
i
d
x
[
x
⊕
n
u
m
]
=
0
idx[x\oplus num]=0
idx[x⊕num]=0。对于每一次查询
l
,
r
l,r
l,r,若满足
d
p
[
r
]
>
=
l
dp[r]>=l
dp[r]>=l 则输出 yes
,否则为 no
。
过题代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 100000 + 100;
int n, m, x, num, l, r;
int dp[maxn], idx[1 << 20];
int main() {
#ifdef ExRoc
freopen("test.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin >> n >> m >> x;
for (int i = 1; i <= n; ++i) {
cin >> num;
dp[i] = max(dp[i - 1], idx[x ^ num]);
idx[num] = i;
}
for (int i = 0; i < m; ++i) {
cin >> l >> r;
cout << (dp[r] >= l ? "yes" : "no") << endl;
}
return 0;
}