제출 #1351374

#제출 시각아이디문제언어결과실행 시간메모리
1351374cpismayilmmdv985동굴 (IOI13_cave)C++20
100 / 100
108 ms504 KiB
#include "cave.h"
#include "bits/stdc++.h"
using namespace std;

void exploreCave(int N) {
   int S[N], D[N];
   bool fixed[N];
   for (int i = 0; i < N; i++)   S[i] = 0, D[i] = -1, fixed[i] = false;
   int curr;
   for (int i = 0; i < N; i++) {
      curr = tryCombination(S);
      // cerr << i << " : " << curr << '\n';
      if (curr == i) {
         // 0 i-ci qapini baglayir
         // 1 i-ci qapini acir
         // qapi hal hazirda baglidir
         int low = 0, high = N - 1, mid, best = -1;
         while (low <= high) {
            mid = (low + high) >> 1;
            int lb = low, rb = mid;
            // cerr << low << ' ' << mid << ' ' << high << " : ";
            for (int j = lb; j <= rb; j++) {
               if (!fixed[j])  S[j] = 1;
            }
            // for (int j = 0; j < N; j++)   cerr << S[j] << ' ';
            // cerr << '\n';
            curr = tryCombination(S);
            // cerr << "curr: " << curr << '\n';
            if (curr != i || curr == -1)   high = mid - 1, best = mid;
            else                             low = mid + 1;
            for (int j = lb; j <= rb; j++)   if (!fixed[j])  S[j] = 0;
         }
         // cerr << "Best: " << best << '\n';
         D[best] = i, S[best] = 1, fixed[best] = true;
      } else {
         // 0 i-ci qapini acir
         // 1 i-ci qapini baglayir
         // qapi hal hazirda aciqdir
         int low = 0, high = N - 1, mid, best = -1;
         while (low <= high) {
            mid = (low + high) >> 1;
            int lb = low, rb = mid;
            // cerr << low << ' ' << mid << ' ' << high << " : ";
            for (int j = lb; j <= rb; j++) {
               if (!fixed[j])  S[j] = 1;
            }
            // for (int j = 0; j < N; j++)   cerr << S[j] << ' ';
            // cerr << '\n';
            curr = tryCombination(S);
            // cerr << "curr: " << curr << '\n';
            if (curr == i)   high = mid - 1, best = mid;
            else                          low = mid + 1;
            for (int j = lb; j <= rb; j++)  if (!fixed[j]) S[j] = 0;
         }
         // cerr << "Best: " << best << '\n';
         D[best] = i, S[best] = 0, fixed[best] = true;
      }
      // cerr << "----\n";
   }
   answer(S, D);
}

/*
5
1 0 1 0 0
1 0 2 4 3


4
1 1 1 0
3 1 0 2
*/
#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...