D. Guess The Maximums——(交互題+二分)

總結

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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章