總結
ILE:我出現了很多次,當時沒找到BUG
原因之一:我要輸出數,沒輸出完,系統在等待我的詢問再回答,一直等待
問題
都說C++的endl自帶flush的效果,但是自己宏定義改了,居然能AC,而且不用宏定義,把在main函數內把endl改成’\n’,居然也OK,很神奇。
算法核心
最多12次,n=1e3
二分最大210=1024
所以:
查詢[1,n]最大值
區間[1,k]二分查詢最大的數在那個集合
查詢非最大數的集合的集合的最大數更新一下
題目鏈接
//#pragma GCC optimize(2)
//#pragma GCC target ("sse4")
#include<bits/stdc++.h>
//typedef long long ll;
#define ull unsigned long long
//#define int long long
#define F first
#define S second
#define endl "\n"//<<flush;
#define eps 1e-6
#define base 131
#define lowbit(x) (x&(-x))
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
#define MAXN 0x7fffffff
#define INF 0x3f3f3f3f3f3f3f3f
#define ferma(a,b) pow(a,b-2)
#define mod(x) (x%mod+mod)%mod
#define pb push_back
#define decimal(x) cout << fixed << setprecision(x);
#define all(x) x.begin(),x.end()
#define memset(a,b) memset(a,b,sizeof(a));
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
void file()
{
#ifdef ONLINE_JUDGE
#else
freopen("D:/LSNU/codeforces/duipai/data.txt","r",stdin);
// freopen("D:/LSNU/codeforces/duipai/WA.txt","w",stdout);
#endif
}
signed main()
{
// IOS;
file();
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
vector<int>vec[k],dp(k+1);
for(int i=0; i<k; i++)
{
int c;
cin>>c;
dp[i+1]=dp[i]+c;
vec[i].resize(c);
for(auto &it:vec[i])
cin>>it;
}
int maxn;
cout<<"? "<<n;
for(int i=1; i<=n; i++)
cout<<" "<<i;
cout<<endl;
cin>>maxn;
int l=1,r=k,num;
while(l<r)
{
int mid=(l+r)>>1;
cout<<"? ";
cout<<dp[mid]-dp[l-1];
for(int i=l; i<=mid; i++)
{
for(auto it:vec[i-1])
cout<<" "<<it;
}
cout<<endl;
cin>>num;
if(num!=maxn)
l=mid+1;
else
r=mid;
}
vector<int>ans(k,maxn);
if(vec[l-1].size()!=n)
{
set<int>se;
for(auto it:vec[l-1])
se.insert(it);
cout<<"? "<<n-se.size();
for(int i=1; i<=n; i++)
if(!se.count(i))
cout<<" "<<i;
cout<<endl;
cin>>num;
ans[l-1]=num;
}
cout<<"!";
for(auto it:ans)
cout<<" "<<it;
cout<<endl;
string str;
cin>>str;
if(str!="Correct")
break;
}
return 0;
}