제출 #1208561

#제출 시각아이디문제언어결과실행 시간메모리
1208561pera동굴 (IOI13_cave)C++20
13 / 100
194 ms131072 KiB
#include<bits/stdc++.h>
#include "cave.h"
using namespace std;

void exploreCave(int N) {
   int S[N] , D[N] , W[N];
   memset(S , 0 , sizeof(S));
   memset(W , 0 , sizeof(W));
   int u;
   while(true){
      u = tryCombination(W);
      if(u == -1){
         break;
      }
      vector<int> v;
      for(int i = 0;i < N;i ++){
         if(W[i] == 0){
            v.emplace_back(i);
         }
      }
      auto assign = [&](vector<int> &a){
         if(a.empty()){
            return false;
         }
         for(int x : a){
            W[x] = 1;
         }
         int A = tryCombination(W);
         for(int x : a){
            W[x] = 0;
         }
         return (A != u);
      }; 
      function<int(vector<int>&)> solve = [&](vector<int> &a){
         if((int)a.size() == 1){
            return a[0];
         }
         vector<int> L , R;
         for(int i = 0;i < (int)a.size();i ++){
            if(i < (int)a.size() / 2){
               L.push_back(a[i]);
            }else{
               R.push_back(a[i]);
            }
         }
         if(assign(L)){
            return solve(L);
         }
         return solve(R);
      };
      int p = solve(v);
      S[p] = W[p] = 1;
      D[p] = u;
   }
   for(int i = 0;i < N;i ++){
      W[i] = 1;
   }
   while(true){
      u = tryCombination(W);
      if(u == -1){
         break;
      }
      vector<int> v;
      for(int i = 0;i < N;i ++){
         if(W[i] == 1 && !S[i]){
            v.emplace_back(i);
         }
      }
      auto assign = [&](vector<int> &a){
         if(a.empty()){
            return false;
         }
         for(int x : a){
            W[x] = 0;
         }
         int A = tryCombination(W);
         for(int x : a){
            W[x] = 1;
         }
         return (A != u);
      }; 
      function<int(vector<int>&)> solve = [&](vector<int> &a){
         if((int)a.size() == 1){
            return a[0];
         }
         vector<int> L , R;
         for(int i = 0;i < (int)a.size();i ++){
            if(i < (int)a.size() / 2){
               L.push_back(a[i]);
            }else{
               R.push_back(a[i]);
            }
         }
         if(assign(L)){
            return solve(L);
         }
         return solve(R);
      };
      int p = solve(v);
      S[p] = W[p] = 0;
      D[p] = u;
   }
   answer(S , D);
   return;
}
#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...