Submission #1301957

#TimeUsernameProblemLanguageResultExecution timeMemory
1301957regulardude6Cave (IOI13_cave)C++20
0 / 100
141 ms580 KiB
#include "cave.h"
#include <bits/stdc++.h>
using namespace std;

static vector<int> S, D;
static vector<int> assignedState, assignedDoor;
static vector<int> cand, tmp;

void exploreCave(int N) {
    S.assign(N, 0);
    D.assign(N, 0);
    assignedState.assign(N, -1);
    assignedDoor.assign(N, -1);
    cand.clear();
    cand.reserve(N);
    for (int i = 0; i < N; i++) cand.push_back(i);

    for (int door = 0; door < N; door++) {
        // determine correct state for the switch controlling this door
        for (int i = 0; i < N; i++) {
            if (assignedState[i] != -1) S[i] = assignedState[i];
            else S[i] = 0;
        }
        int res = tryCombination(S.data());
        int targetState = (res == -1 || res > door) ? 0 : 1;

        // binary search for the switch in cand controlling this door
        while (cand.size() > 1) {
            int mid = cand.size() / 2;
            for (int i = 0; i < N; i++) S[i] = (targetState ^ 1);
            for (int v : cand) {
                if (assignedState[v] != -1) {
                    S[v] = assignedState[v];
                } else {
                    S[v] = (targetState ^ 1);
                }
            }
            for (int i = 0; i < mid; i++) {
                int v = cand[i];
                if (assignedState[v] == -1) S[v] = targetState;
            }
            int x = tryCombination(S.data());
            bool inFirst = (x == -1 || x > door);
            tmp.clear();
            tmp.reserve(cand.size());
            if (inFirst) {
                for (int i = 0; i < mid; i++) tmp.push_back(cand[i]);
            } else {
                for (size_t i = mid; i < cand.size(); i++) tmp.push_back(cand[i]);
            }
            cand.swap(tmp);
        }

        // assign the found switch
        int sw = cand[0];
        assignedDoor[sw] = door;
        assignedState[sw] = targetState;
        cand.clear();
        cand.reserve(N);
        for (int i = 0; i < N; i++) {
            if (assignedDoor[i] == -1) cand.push_back(i);
        }
    }
   
    for (int i = 0; i < N; i++) {
        S[i] = assignedState[i];
        D[i] = assignedDoor[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...