题解:P17115 [Algo Beat 009 & MROI-R1] ANDOR
这纯是诈骗题吧。
首先有个经典结论:
下文中的所有操作均是能知道两个数的和的操作,操作数最多为
对于三个连续的数
可以先求出
但是操作数不能超过
#include<bits/stdc++.h>
const int MAXN = 200000 + 5;
#define pb push_back
typedef long long LL;
int n, k;
int p[MAXN];
inline int ask(int op, int x, int y)
{
std::cout << "? ";
if(!op) std::cout << "and ";
else std::cout << "or ";
std::cout << x << ' ' << y << std::endl;
std::cout.flush();
int r; std::cin >> r;
return r;
}
bool vis[MAXN];
int main()
{
std::cin >> n >> k;
int k1 = ask(0, 1, 2) + ask(1, 1, 2),
k2 = ask(0, 2, 3) + ask(1, 2, 3),
k3 = ask(0, 1, 3) + ask(1, 1, 3);
p[1] = (k1 + k3 - k2) / 2, p[2] = (k1 + k2 - k3) / 2, p[3] = (k2 + k3 - k1) / 2;
vis[p[1]] = vis[p[2]] = vis[p[3]] = 1;
for(int i = 4; i < n; i++)
{
int v = ask(0, i - 1, i) + ask(1, i - 1, i);
p[i] = v - p[i - 1], vis[p[i]] = 1;
}
for(int i = 0; i < n; i++)
if(!vis[i])
{
p[n] = i;
break;
}
std::cout << "! ";
for(int i = 1; i <= n; i++)
{
std::cout << p[i];
if(i ^ n) std::cout << ' ';
std::cout.flush();
}
std::cout.flush();
return 0;
}
::::