题目大意:交互题,有n个数,不超过2n次操作找到第k的数是什么?
操作:你每次操作可以任意选择俩个坐标的数获得他们的按位与或按位或。
3<=n<=1e4
思路:a&b+a|b=a+b,那么就是小学解方程。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
struct node{
int a;int id;
}a[10005];
bool cmp(node a,node b){
return a.a<b.a;
}
void solve()
{int n,k;
cin>>n>>k;
int x,y,z,x1,x2;
for(int i=1,j=3;j<=n;j+=3,i+=3){
cout<<"and"<<' '<<i<<' '<<i+1<<endl;
cin>>x1;
cout<<"or"<<' '<<i<<' '<<i+1<<endl;
cin>>x2;
x=x1+x2;//1 2
cout<<"and"<<' '<<i+1<<' '<<i+2<<endl;
cin>>x1;
cout<<"or"<<' '<<i+1<<' '<<i+2<<endl;
cin>>x2;
y=x1+x2;//2 3
cout<<"and"<<' '<<i<<' '<<i+2<<endl;
cin>>x1;
cout<<"or"<<' '<<i<<' '<<i+2<<endl;
cin>>x2;
z=x1+x2;//1 3
a[i].a=(x+y+z)/2-y;a[i].id=i;
a[i+1].a=(x+y+z)/2-z;a[i+1].id=i+1;
a[i+2].a=(x+y+z)/2-x;a[i+2].id=i+2;
}
if(n%3==1){
cout<<"and"<<' '<<n<<' '<<'1'<<endl;
cin>>x1;
cout<<"or"<<' '<<n<<' '<<'1'<<endl;
cin>>x2;
int yy=x1+x2;
a[n].a=yy-a[1].a;
a[n].id=n;
}
else if(n%3==2)
{
cout<<"and"<<' '<<n-1<<' '<<'1'<<endl;
cin>>x1;
cout<<"or"<<' '<<n-1<<' '<<'1'<<endl;
cin>>x2;
int yy=x1+x2;
a[n-1].a=yy-a[1].a;a[n-1].id=n-1;
cout<<"and"<<' '<<n<<' '<<1<<endl;
cin>>x1;
cout<<"or"<<' '<<n<<' '<<1<<endl;
cin>>x2;
yy=x1+x2;
a[n].a=yy-a[1].a;a[n].id=n;
}
sort(a+1,a+1+n,cmp);
printf("finish %lld\n",a[k].a);
}
signed main(){
solve();
}/*
x=a+b;
y=a+c;
z=b+c;
a=
*/