Submission #754112

#TimeUsernameProblemLanguageResultExecution timeMemory
754112PanosPaskCave (IOI13_cave)C++14
100 / 100
819 ms676 KiB
#include "cave.h"
#include <bits/stdc++.h>

const int MAXN = 5000;

using namespace std;

int n;
int D[MAXN];
int S[MAXN];
int is_up[MAXN];
int proper_switch[MAXN];

bool test_door(int S[], int door)
{
    int a = tryCombination(S);

    if (a == -1 || a > door)
        return true;
    else
        return false;
}

void set_everything(int from, int to, bool spec)
{
    for (int i = 0; i < n; i++) {
        if (D[i] != -1)
            continue;

        if (i >= from && i < to)
            S[i] = spec;
        else
            S[i] = !spec;
    }
}

void exploreCave(int N)
{
    n = N;

    for (int i = 0; i < n; i++)
        D[i] = -1;

    for (int door = 0; door < n; door++) {
        // Find the best for each door

        // Begin by trying every possible switch closed
        for (int i = 0; i < n; i++)
            if (D[i] == -1)
                S[i] = false;

        if (test_door(S, door))
            is_up[door] = false;
        else
            is_up[door] = true;

        // Switch is contained in [l...r)
        int l = 0;
        int r = n;
        while (r > l + 1) {
            int mid = (l + r) / 2;
            set_everything(l, mid, is_up[door]);

            if (test_door(S, door))
                r = mid;
            else
                l = mid;
        }

        D[l] = door;
        S[l] = is_up[door];
    }

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