F. Lisa and the Martians

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;
}
posted @ 2023-10-06 22:49  不o凡  阅读(21)  评论(0)    收藏  举报