Submission #1304900

#TimeUsernameProblemLanguageResultExecution timeMemory
1304900kaloyanCave (IOI13_cave)C++20
100 / 100
459 ms532 KiB
#include "cave.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <cassert>

const int MAXN = 5000;

int n;
int answered[MAXN];
int bind[MAXN];
int lever[MAXN];

int tryCombination(int S[]);

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

void flip(int arr[], int idx)
{
    for(int i = 0 ; i <= idx ; ++i)
    {
        if(answered[i])
        {
            continue;
        }

        arr[i] ^= 1;
    }
}

bool f(int doorIdx, bool wasClosed, int leverIdx)
{
    flip(lever, leverIdx);
    int res = tryCombination(lever);
    flip(lever, leverIdx);

    if(wasClosed)
    {
        return res != doorIdx;
    }
    else
    {
        return res == doorIdx;
    }
}

void exploreCave(int N)
{
    n = N;
    std::fill(answered, answered + n, 0);
    std::fill(lever, lever + n, 0);

    for(int i = 0 ; i < n ; ++i)
    {
        bool isClosed = (tryCombination(lever) == i);

        int l = -1, r = n - 1;
        while(l + 1 < r)
        {
            int mid = (l + r) / 2;
            if(!f(i, isClosed, mid)) l = mid;
            else r = mid;
        }

        //std::cout << i << " " << r << "\n";

        answered[r] = 1;
        bind[r] = i;
        
        if(isClosed)
        {
            lever[r] ^= 1;
        }
    }

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