<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      P14134 題解——隨機化太帥了

      題意

      有一個 \(0 \sim n - 1\) 的排列 \(a_1 \dots a_n\),有以下兩種詢問:

      • 詢問一個集合 \(S\),交互庫返回 \(\min_{x \in S} a_x + \operatorname{mex}_{x \in S} a_x\)。(這種詢問最多 \(35\) 次)
      • 詢問一個集合 \(S\), 交互庫返回 \(\min_{x \in S} a_x - \operatorname{mex}_{x \in S}a_x\)。(這種詢問最多 \(1\) 次)

      你的目標是找出 \(0\) 的位置。

      特殊性質 A

      序列的前一半是偶數,后一半是奇數。

      那么只需在前一半里面二分,如果一個區間里面包含 \(0\),那么他的詢問 1 一定返回 1。

      解法

      我們要意識到,詢問 2 一定是用來區分 \(1\)\(0\) 的。

      但是沒有特殊性質時,我們的詢問 1 的值或許會一樣。比如 1 02 這兩個集合,返回的都是 \(2\)。所以我們的首要任務就是將 \(1\)\(0\) 分到兩個集合中。

      確定性算法想不到,隨機化算法出戰。考慮隨機打亂序列將其分成兩個部分,如果其中一個部分的詢問 1 為 \(1\),此時表明 \(1\)\(0\) 被分到了兩個集合里,此時再用一次詢問 2,即可區分 \(0\)\(1\)。這邊的期望詢問次數為 \(2\)

      最后再在 \(0\) 的那個集合中二分就可以了。

      詢問次數 \(O(\log n) + O(1)\)

      Code

      #include <bits/stdc++.h>
      using namespace std;
      
      int n, ans;
      
      int query(int op, vector<int> &a, int l, int r){
          cout << "? " << op << ' ' << r - l + 1;
          for(int i = l; i <= r; i++) cout << ' ' << a[i];
          cout << endl;
      
          int res;    cin >> res;
          return res;
      }
      
      int main(){
          cin >> n;
          if(n == 1){
              cout << "! " << 1 << endl;
              return 0;
          }
      	
          vector<int> a(n + 1, 0);
          for(int i = 1; i <= n; i++) a[i] = i;
          random_device rd;
          mt19937 g(rd());
          while(1){
              shuffle(a.begin() + 1, a.end(), g);
              if(query(1, a, 1, n / 2) == 1) break;
          }
          vector<int> v;
          if(query(2, a, 1, n / 2) == 1) v.assign(a.begin() + 1 + (n + 1) / 2, a.end());
          else v.assign(a.begin() + 1, a.begin() + 1 + n / 2);
          v.insert(v.begin(), 0);
          int l = 1, r = v.size() - 1;
          while(l <= r){
              int mid = (l + r) >> 1;
              if(query(1, v, l, mid) == 1){
                  ans = v[mid];
                  r = mid - 1;
              }
              else l = mid + 1;
          }
          cout << "! " << ans;
          return 0;
      }
      
      posted @ 2025-10-05 10:26  dairuize  閱讀(7)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产精品 第一页第二页| 在线 欧美 中文 亚洲 精品| 青青草成人免费自拍视频| 激情综合五月| 亚洲人成网站免费播放| 国精品无码人妻一区二区三区| 日韩一区二区三区日韩精品| 五月天国产成人av免费观看| 欧美孕妇乳喷奶水在线观看| 国产亚洲色婷婷久久99精品| 成人aⅴ综合视频国产| 国产原创自拍三级在线观看| 一区二区三区午夜无码视频| 国产尤物精品自在拍视频首页| 浪潮av色综合久久天堂| 白白发布视频一区二区视频| 亚洲69视频| 亚洲国产中文字幕精品| 国产日韩久久免费影院| 精品午夜久久福利大片| 一本无码av中文出轨人妻| 亚洲欧美国产精品久久久久久久| 国产精品十八禁在线观看| 搡老熟女老女人一区二区| 亚洲国产在一区二区三区| 国产亚洲精品久久综合阿香| 午夜福利在线观看6080| 色综合久久中文字幕综合网| 久久久久久久一线毛片| 欧美人与禽2o2o性论交| 国产91小视频在线观看| 国产一区二区在线影院| 黎城县| 99久久精品国产综合一区| 激情综合色综合啪啪开心| 欧美国产日韩在线三区| 久久精品蜜芽亚洲国产AV| 四虎成人高清永久免费看| 蜜桃视频在线免费观看一区二区| 亚洲人妻精品一区二区| 亚洲日韩亚洲另类激情文学|