Submission #1301972

#TimeUsernameProblemLanguageResultExecution timeMemory
1301972marlesamtamCave (IOI13_cave)C++20
100 / 100
496 ms560 KiB
#include "cave.h"
#include <bits/stdc++.h>
using namespace std;

void exploreCave(int N) {
    vector<int> S(N, 0), D(N, -1);
    vector<int> fixedState(N, -1);
    vector<int> rem;
    rem.reserve(N);
    for (int i = 0; i < N; i++) rem.push_back(i);

    for (int door = 0; door < N; door++) {
        for (int i = 0; i < N; i++) {
            if (fixedState[i] != -1) S[i] = fixedState[i];
            else S[i] = 0;
        }
        int r = tryCombination(S.data());
        int need = (r == door ? 1 : 0);

        int lo = 0, hi = (int)rem.size() - 1;
        while (lo < hi) {
            int mid = (lo + hi) >> 1;

            for (int i = 0; i < N; i++) {
                if (fixedState[i] != -1) S[i] = fixedState[i];
                else S[i] = (need ^ 1);
            }
            for (int k = lo; k <= mid; k++) S[rem[k]] = need;

            int x = tryCombination(S.data());
            bool ok = (x == -1 || x > door);
            if (ok) hi = mid;
            else lo = mid + 1;
        }

        int sw = rem[lo];
        fixedState[sw] = need;
        D[sw] = door;
        rem.erase(rem.begin() + lo);
    }

    for (int i = 0; i < N; i++) S[i] = fixedState[i];
    answer(S.data(), D.data());
}
#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...