zoukankan      html  css  js  c++  java
  • [CF1363D] Guess The Maximums

    [CF1363D] Guess The Maximums

    Description

    给定序列 (a) 的长度 (n)(k) 个互不相交的子集 (S_i),每次查询可以输出一些下标 (q_1,q_2,...,q_c) 并得到序列中这些位置的数的最大值。对每个子集 (S_i),求出序列 a 中不在该子集下标范围内的最大值。

    Solution

    通过不超过 11 次询问找出序列中最大值的下标 m,含有 m 的子集显然只有一个 (S_x),则对任意 (S_i, i eq x) 其答案显然为 m,对于 (S_x),我们手动求一次不在该子集内的最大值即可。

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    int make_query(int l, int r)
    {
        cout << "? " << r - l + 1 << " ";
        for (int i = l; i <= r; i++)
            cout << i << " ";
        cout << endl;
        int ans = 0;
        cin >> ans;
        return ans;
    }
    
    signed main()
    {
        int t;
        cin >> t;
    
        while (t--)
        {
            int n, k;
            cin >> n >> k;
    
            vector<int> qid(n + 2);
            for (int i = 1; i <= k; i++)
            {
                int size;
                cin >> size;
                for (int j = 1; j <= size; j++)
                {
                    int t;
                    cin >> t;
                    qid[t] = i;
                }
            }
    
            int l = 1, r = n;
            int max_value = make_query(1, n);
    
            while (l < r)
            {
                int mid = (l + r) / 2;
                if (make_query(l, mid) == max_value)
                    r = mid;
                else
                    l = mid + 1;
            }
    
            int m = l;
    
            vector<int> vec;
            for (int i = 1; i <= n; i++)
                if ((qid[i] != qid[m]) || !qid[m])
                    vec.push_back(i);
    
            cout << "? " << vec.size() << " ";
            for (auto i : vec)
                cout << i << " ";
            cout << endl;
            int ans;
            cin >> ans;
    
            cout << "! ";
            for (int i = 1; i <= k; i++)
                if (i == qid[m])
                    cout << ans << " ";
                else
                    cout << max_value << " ";
            cout << endl;
    
            string cor;
            cin >> cor;
        }
    }
    
  • 相关阅读:
    课后作业-阅读任务-阅读笔记-4
    团队编程项目作业5-小组评分
    课后作业-阅读任务-阅读提问-3
    20171110-构建之法:现代软件工程-阅读笔记
    团队-中国象棋-开发文档
    结对-贪吃蛇-结对项目总结
    20171129-构建之法:现代软件工程-阅读笔记
    课后作业-阅读任务-阅读提问-4
    软件工程课程总结
    团队-石头剪刀布-项目总结
  • 原文地址:https://www.cnblogs.com/mollnn/p/14344641.html
Copyright © 2011-2022 走看看