题意:
给出数组的长度
n
n
n
每次可以询问
a
a
n
d
b
a\ and\ b
a and b和
a
o
r
b
a\ or\ b
a or b。(
a
,
b
a,b
a,b为数组元素下标)
问数组中第
k
k
k大。
询问次数不超过
2
n
2n
2n次
思路:
可以先询问
a
1
∣
a
i
a_1|a_i
a1∣ai和
a
1
&
a
i
a1\&a_i
a1&ai。这样得到
a
1
x
o
r
a
i
a_1\ xor\ a_i
a1 xor ai.
然后询问
a
2
∣
a
3
a_2|a_3
a2∣a3和
a
2
&
a
3
a_2\&a_3
a2&a3,得到
a
2
+
a
3
a_2+a_3
a2+a3
a
1
=
a
1
+
a
2
+
a
1
+
a
3
−
a
2
−
a
3
2
a_1=\frac{a1+a2+a1+a3-a2-a3}{2}
a1=2a1+a2+a1+a3−a2−a3
递推得到
a
i
a_i
ai
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
//#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll>PLL;
typedef pair<int, int>PII;
typedef pair<double, double>PDD;
#define I_int ll
inline ll read(){ll x = 0, f = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-')f = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}return x * f;}
inline void write(ll x){if (x < 0) x = ~x + 1, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0');}
#define read read()
#define closeSync ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define multiCase int T;cin>>T;for(int t=1;t<=T;t++)
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i<(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define perr(i,a,b) for(int i=(a);i>(b);i--)
ll ksm(ll a, ll b,ll mod){ll res = 1;while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}return res;}
const int maxn=2e5+100,inf=0x3f3f3f3f;
const double eps=1e-5;
int n,k,_and[maxn],_or[maxn],ans[maxn];
int main(){
#ifdef LOCAL
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
scanf("%d%d",&n,&k);
rep(i,2,n){
printf("and 1 %d\n",i);
fflush(stdout);
scanf("%d",&_and[i]);
printf("or 1 %d\n",i);
fflush(stdout);
scanf("%d",&_or[i]);
ans[i]=_or[i]-_and[i];
}
int x,y;
printf("and 2 3\n");
fflush(stdout);
cin>>x;
printf("or 2 3\n");
fflush(stdout);
cin>>y;
ans[1]=((_and[2]+_or[2])+(_and[3]+_or[3])-(x+y))/2;
rep(i,2,n) ans[i]=ans[i]^ans[1];
sort(ans+1,ans+1+n);
printf("finish %d\n",ans[k]);
return 0;
}