Submission #811033

#TimeUsernameProblemLanguageResultExecution timeMemory
811033cjoaLost in the cycle (IOI19_cycle)C++17
100 / 100
1 ms208 KiB
#include "cycle.h"
#include <bits/stdc++.h>

using namespace std;

int cnt_jump = 0;
bool my_jump(int x) {
   ++cnt_jump;
//   cout << "Salto #" << cnt_jump << " x = " << x << endl;
   bool res = jump(x);
   return res;
}

void escape(int n) {
   cnt_jump = 0;

   if (n == 2) {
      my_jump(1);
      return;
   }

   bool flag = my_jump(0);

   if (!flag) {
      // inicialmente, estoy en la zona de F

      int lo = 1, hi = n/2;
//      if (n % 2 == 0) hi = n / 2 - 1;
//      else hi = n / 2;

      bool salto_anterior_verdadero = false;
      int salto_anterior = 0;
      while (lo <= hi) {
         int mid = lo + (hi - lo) / 2;
         int x;
         if (salto_anterior_verdadero)
            x = n - salto_anterior + mid;
         else
            x = mid - salto_anterior;
         if (my_jump(x)) {
            hi = mid - 1;
            salto_anterior_verdadero = true;
         }
         else {
            lo = mid + 1;
            salto_anterior_verdadero = false;
         }
         salto_anterior = mid;
      }
      if (salto_anterior_verdadero)
         my_jump(n / 2);
      else
         my_jump(n / 2 + 1);
   }
   else {
      // inicialmente, estoy en la zona de T

      int lo = 1, hi = n/2;

      bool salto_anterior_verdadero = false;
      int salto_anterior = 0;
      while (lo <= hi) {
         int mid = lo + (hi - lo) / 2;
         int x;
         if (salto_anterior_verdadero)
            x = n - salto_anterior + mid;
         else
            x = mid - salto_anterior;
         x %= n;
         if (x < 0) x += n;
         if (my_jump(x)) {
            lo = mid + 1;
            salto_anterior_verdadero = true;
         }
         else {
            hi = mid - 1;
            salto_anterior_verdadero = false;
         }
         salto_anterior = mid;
      }
      if (salto_anterior_verdadero) {
         // no tengo que saltar
      }
      else
         my_jump(n - 1);
   }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...