제출 #1331581

#제출 시각아이디문제언어결과실행 시간메모리
1331581huutuanHow to Avoid Disqualification in 75 Easy Steps (CEOI23_avoid)C++20
25 / 100
1 ms436 KiB
#include "avoid.h"

#include <bits/stdc++.h>

using namespace std;

pair<int, int> scout(int R, int H){
   if (R==10 && H==1){
      for (int i=0; i<10; ++i){
         vector<int> vv;
         for (int j=1; j<=1000; ++j) if (j>>i&1) vv.push_back(j);
         send(vv);
      }
      auto v=wait();
      int ans=0;
      for (int i=0; i<10; ++i) ans|=v[i]<<i;
      return {ans, ans};
   }
   if (R==20 && H==20){
      int l=1, r=1000;
      while (l<=r){
         int mid=(l+r)>>1;
         vector<int> vv(mid-l+1);
         iota(vv.begin(), vv.end(), l);
         send(vv);
         auto v=wait();
         if (v[0]) r=mid-1;
         else l=mid+1;
      }
      pair<int, int> ans={-1, -1};
      ans.first=l;
      l=ans.first+1, r=1000;
      while (l<=r){
         int mid=(l+r)>>1;
         vector<int> vv(mid-l+1);
         iota(vv.begin(), vv.end(), l);
         send(vv);
         auto v=wait();
         if (v[0]) r=mid-1;
         else l=mid+1;
      }
      ans.second=l;
      if (ans.second==1001) ans.second=ans.first;
      return ans;
   }
   if (R==30 && H==2){
      for (int i=0; i<10; ++i){
         vector<int> v0, v1;
         for (int j=1; j<=1000; ++j){
            if (j>>i&1) v1.push_back(j);
            else v0.push_back(j);
         }
         send(v0); send(v1);
      }
      auto v=wait();
      int msk=0, msk2=0;
      vector<int> bits;
      for (int i=0; i<10; ++i){
         if (v[i<<1]!=v[i<<1|1]) msk|=v[i<<1|1]<<i;
         else bits.push_back(i), msk2|=1<<i;
      }
      msk2|=msk;
      if (bits.empty()) return {msk, msk};
      else if ((int)bits.size()==1){
         return {msk, msk|(1<<bits[0])};
      }else{
         pair<int, int> ans={msk, msk|(1<<bits[0])};
         for (int i=1; i<(int)bits.size(); ++i){
            vector<int> vv;
            for (int j=1; j<=1000; ++j) if ((j&msk)==msk && (j&msk2)==j){
               if ((j>>bits[i]&1)==0 && (j>>bits[0]&1)==0) vv.push_back(j);
            }
            send(vv);
         }
         v=wait();
         for (int i=1; i<(int)bits.size(); ++i){
            if (v[i-1]){
               ans.second|=1<<bits[i];
            }else{
               ans.first|=1<<bits[i];
            }
         }
         return ans;
      }
   }
   for (int i=0; i<10; ++i){
      vector<int> v0, v1;
      for (int j=1; j<=1000; ++j){
         if (j>>i&1) v1.push_back(j);
         else v0.push_back(j);
      }
      send(v0); send(v1);
   }
   vector<pair<int, int>> pb;
   for (int b1=0; b1<10; ++b1){
      for (int b2=b1+1; b2<10; ++b2){
         pb.emplace_back(b1, b2);
         vector<int> vv;
         for (int j=1; j<=1000; ++j){
            if ((j>>b1&1)==0 && (j>>b2&1)==0) vv.push_back(j);
         }
         send(vv);
      }
   }
   auto v=wait();
   int msk=0;
   vector<int> bits;
   for (int i=0; i<10; ++i){
      if (v[i<<1]!=v[i<<1|1]) msk|=v[i<<1|1]<<i;
      else bits.push_back(i);
   }
   if (bits.empty()) return {msk, msk};
   else if ((int)bits.size()==1){
      return {msk, msk|(1<<bits[0])};
   }else{
      pair<int, int> ans={msk, msk|(1<<bits[0])};
      v=wait();
      for (int i=1; i<(int)bits.size(); ++i){
         if (v[10+find(pb.begin(), pb.end(), make_pair(bits[0], bits[i]))-pb.begin()]){
            ans.second|=1<<bits[i];
         }else{
            ans.first|=1<<bits[i];
         }
      }
      return ans;
   }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...