Submission #703552

#TimeUsernameProblemLanguageResultExecution timeMemory
703552mircea_007Cave (IOI13_cave)C++17
100 / 100
914 ms672 KiB
#include "cave.h"

#define magic_sauce inline __attribute__((always_inline))

const int MAXN = 5000;
const int UNDEF = -1;
const int INF = 1e9;

int out[MAXN];
int set[MAXN];

int q[MAXN];

int p[MAXN];

int query( int n, int q[] ){
  for( int i = 0 ; i < n ; i++ )
    out[i] = set[i] < 0 ? q[i] : set[i];

  int ret = tryCombination( out );

  return ret < 0 ? +INF : ret;
}

void exploreCave( int N ){
  int i, j, val;
  int st, dr, mij;
  
  for( i = 0 ; i < N ; i++ )
    set[i] = UNDEF;

  for( i = 0 ; i < N ; i++ ){
    for( j = 0 ; j < N ; j++ )
      q[j] = 0;

    val = (query( N, q ) == i);

    st = 0;
    dr = N;
    while( dr - st > 1 ){
      mij = (dr + st) >> 1;

      for( j = 0 ; j < mij ; j++ )
        q[j] = val;
      for( ; j < N ; j++ )
        q[j] = (val ^ 1);

      if( query( N, q ) == i )
        st = mij;
      else
        dr = mij;
    }

    p[st] = i; // the st-th switch toggles the i-th door
    set[st] = val;
  }

  answer( set, p );
}
#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...