题意:
给出数组的长度n
每次可以询问a a n d b和a o r b。(a , b为数组元素下标)
问数组中第k大。
询问次数不超过2 n次
思路:
可以先询问a 1 ∣ a i 和a 1 & a i。这样得到a 1 x o r a i .
然后询问a 2 ∣ a 3和a 2 & a 3,得到a2+a3a 1 = a 1 + a 2 + a 1 + a 3 − a 2 − a 3 2 a_1=\frac{a1+a2+a1+a3-a2-a3}{2}a
1=2a1+a2+a1+a3−a2−a3
代码:
#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; }