F. Lisa and the Martians
问题求y =(a[i] ^ x)& (a[j] ^ x)最大,可知x可自由选择,那么我们就考虑y怎么取最大值
1.根据&,可知a[i]a[j]1时,二进制该位置为1,若x可使得俩位置为1,那么就转换成最多的a[i]==a[j]的位置,也就是a[i]^a[j]的最小值,可知只要俩数相差不大,异或值越小
2.所以可以找到异或最小值的两点(相邻),根据两者的二进制算出x,x可能多解
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
pair<int,int> v[N];
bool cmp(pair<int,int> a,pair<int,int> b){
return a.first<b.first;
}
void solve(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>v[i].first;
v[i].second=i;
}
sort(v+1,v+1+n,cmp);
int mx=2e9,id=0;
for(int i=2;i<=n;i++){
if(mx>(v[i].first^v[i-1].first)){
mx=v[i].first^v[i-1].first;
id=i;
}
}
//算x
int p1=v[id-1].first,p2=v[id].first;
int x=0,t=1;
for(int i=0;i<m;i++){
if((p1&1)==0&&(p2&1)==0) x+=t;
t*=2;
p1>>=1,p2>>=1;
}
//其实x也可以直接写成x=((1<<m)-1)^a[id].first,id选id-1也行,主要是遇到1就要取零,所以答案不唯一
cout<<v[id-1].second<<' '<<v[id].second<<' '<<x;
cout<<'\n';
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}