Submission #432138

#TimeUsernameProblemLanguageResultExecution timeMemory
432138MilosMilutinovicCave (IOI13_cave)C++14
100 / 100
1063 ms580 KiB
#include "cave.h"
#include <bits/stdc++.h>
using namespace std;

int tryCombination(int S[]);

void answer(int S[], int D[]);

void exploreCave(int N) {
    int combination[N];
    for (int i = 0; i < N; i++)
        combination[i] = 0;

    bool locked[N];
    for (int i = 0; i < N; i++)
        locked[i] = false;

    int position[N];
    for (int i = 0; i < N; i++) {
        vector<int> positions;
        for (int j = 0; j < N; j++)
            if (!locked[j])
                positions.push_back(j);

        int current = tryCombination(combination);
        bool is_correct = (current == -1 || current > i);

        if (!is_correct) {
            assert(current == i);
            int bot = 0, top = (int) positions.size() - 1, pos = -1;
            while (bot <= top) {
                int mid = bot + top >> 1;
                for (int j = 0; j <= mid; j++)
                    combination[positions[j]] ^= 1;

                int value = tryCombination(combination);
                if (value == -1 || value > i)
                    pos = mid, top = mid - 1;
                else
                    bot = mid + 1;

                for (int j = 0; j <= mid; j++)
                    combination[positions[j]] ^= 1;
            }
            assert(pos != -1);
            combination[positions[pos]] = 1;
            locked[positions[pos]] = true;
            position[positions[pos]] = i;
        } else {
            int bot = 0, top = (int) positions.size() - 1, pos = -1;
            while (bot <= top) {
                int mid = bot + top >> 1;
                for (int j = 0; j <= mid; j++)
                    combination[positions[j]] ^= 1;

                int value = tryCombination(combination);
                if (value == i)
                    pos = mid, top = mid - 1;
                else
                    bot = mid + 1;

                for (int j = 0; j <= mid; j++)
                    combination[positions[j]] ^= 1;
            }
            assert(pos != -1);
            locked[positions[pos]] = true;
            position[positions[pos]] = i;
        }
    }
    answer(combination, position);
}

Compilation message (stderr)

cave.cpp: In function 'void exploreCave(int)':
cave.cpp:32:31: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   32 |                 int mid = bot + top >> 1;
      |                           ~~~~^~~~~
cave.cpp:52:31: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   52 |                 int mid = bot + top >> 1;
      |                           ~~~~^~~~~
#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...