D. Take a Guess
题意:
给定两种查询
o
r
i
j
or \ \ i \ \ j
or i j 查询
a
i
∣
a
j
a_i|a_j
ai∣aj 的值
a
n
d
i
j
and \ \ i \ \ j
and i j 查询
a
i
&
a
j
a_i\&a_j
ai&aj 的值
思路:
a
+
b
=
a
∣
b
+
a
&
b
a+b=a|b+a\&b
a+b=a∣b+a&b
先查
2
∗
(
n
−
1
)
2*(n-1)
2∗(n−1) 次
1
1
1 和
2
,
3
,
4...
2,3,4...
2,3,4... 就可以得到
a
1
+
a
i
(
i
>
=
2
)
a_1+a_i(i>=2)
a1+ai(i>=2) 的值
最后查一次
a
2
+
a
3
a_2+a_3
a2+a3
(
a
1
+
a
2
)
+
(
a
1
+
a
3
)
−
(
a
2
+
a
3
)
(a_1+a_2)+(a_1+a_3)-(a_2+a_3)
(a1+a2)+(a1+a3)−(a2+a3) 即可得到
2
∗
a
1
2*a_1
2∗a1
求出
a
1
.
.
.
a
n
a_1...a_n
a1...an 排序输出答案就好了
code:
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define ull unsigned long long
#define ld long double
#define all(x) x.begin(), x.end()
#define eps 1e-6
using namespace std;
const int maxn = 1e4 + 9;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll n, m;
int a[maxn];
int qry(int x, int y){
int a, b;
cout << "or " << x << " " << y << endl;
fflush(stdout);
cin >> a;
cout << "and " << x << " " << y << endl;
fflush(stdout);
cin >> b;
return a + b;
}
void work()
{
cin >> n >> m;
for(int i = 2; i <= n; ++i){
a[i] = qry(1, i);
}
int d = qry(2, 3);
a[1] = ((1ll * a[2] + a[3] + d) >> 1) - d;
for(int i = 2; i <= n; ++i) a[i] -= a[1];
sort(a + 1, a + 1 + n);
cout << "finish " << a[m] << endl;
}
int main()
{
ios::sync_with_stdio(0);
// int TT;cin>>TT;while(TT--)
work();
return 0;
}