题目 2665:
蓝桥杯2022年第十三届省赛真题-选数异或
时间限制: 3s 内存限制: 320MB 提交: 8328 解决: 1505
题目描述
给定一个长度为 n 的数列 A1, A2, · · · , An 和一个非负整数 x,给定 m 次查询, 每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x 。
输入格式
输入的第一行包含三个整数 n, m, x 。
第二行包含 n 个整数 A1, A2, · · · , An 。
接下来 m 行,每行包含两个整数 li ,ri 表示询问区间 [li ,ri ] 。
输出格式
对于每个询问, 如果该区间内存在两个数的异或为 x 则输出 yes, 否则输出 no。
样例输入
复制
4 4 1 1 2 3 4 1 4 1 2 2 3 3 3
样例输出
复制
yes no yes no
提示
显然整个数列中只有 2, 3 的异或为 1。
对于 20% 的评测用例,1 ≤ n, m ≤ 100;
对于 40% 的评测用例,1 ≤ n, m ≤ 1000;
对于所有评测用例,1 ≤ n, m ≤ 100000 ,0 ≤ x < 220 ,1 ≤ li ≤ ri ≤ n , 0 ≤ Ai < 220。
解决方法
直接暴力输出就行,两两进行比较,如果存在结果与x一样就输出yes,否则就输出no。
#include<iostream>
#include<algorithm>
using namespace std;
int judge(int a,int b,int x){ //求异或
int p=a^b;
if(p==x){
return 1;
}
else
return 0;
}
int f(int a[],int l, int r,int x){ //试一下全排列怎么用的
do{
for(int j=l;j<=r;j++){
if(judge(a[l],a[l+1],x)){
printf("yes\n");
return 0;
}
}
}while(next_permutation(a+l,a+r));
printf("no\n");
return 0;
}
int f2(int a[],int l, int r,int x){
for(int i=l;i<=r;i++){
for(int j=i+1;j<=r;j++){
if(judge(a[i],a[j],x)){
printf("yes\n");
return 0;
}
}
}
printf("no\n");
return 0;
}
int main(){
int n,m,x;
int a[100000+1],b[100000+1];
scanf("%d%d%d",&n,&m,&x);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
int i=0;
while(i<m){
for(int j=0;j<n;j++){
b[j]=a[j];
}
int l,r;
scanf("%d%d",&l,&r);
f2(b,l-1,r-1,x);
i++;
}
return 0;
}