题解:CF2159A MAD Interactive Problem
S1lver_W0lf · · 题解
题解:CF2159A MAD Interactive Problem
:::info[关于交互题]
每次输出完成之后需要刷新缓存区。为了刷新缓存区并换行,可以直接输出 std::endl。
:::
分析题意
需要我们求得的
每次提问需要给出提问的下标,然后交互库会返回这些下标的 MAD 值。MAD 值的定义在题面已经给出。
接下来分析这个条件:ans 来存储最终的答案。
最开始,下标 ans[i] = x,并将 ans[i] 不确定,并将
这一步执行完会提问
接下来,从 ans[i] = x。由于在
当第一步执行完时,集合
最后一共提问
代码
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n;
cin >> n;
vector <int> known, unknown, ans(2 * n + 1);//known 对应集合 K,unknown 对应集合 U
unknown.emplace_back(1);
for(int i = 2; i <= 2 * n; i++){
cout << "? " << unknown.size() + 1 << ' ';
for(const auto &v : unknown)
cout << v << ' ';
cout << i << endl;
int x;
cin >> x;
if(x)
ans[i] = x, known.emplace_back(i);
else
unknown.emplace_back(i);
}
for(int i = 1; i <= 2 * n; i++){
if(!ans[i]){
cout << "? " << known.size() + 1 << ' ';
for(const auto &x : known)
cout << x << ' ';
cout << i << endl;
int x;
cin >> x;
ans[i] = x;
}
}
cout << "! ";
for(int i = 1; i <= 2 * n; i++)
cout << ans[i] << " \n"[i == 2 * n];
}
int main(){
int t;
cin >> t;
while(t--)
solve();
}