제출 #1274167

#제출 시각아이디문제언어결과실행 시간메모리
1274167RomanLeshchuk동굴 (IOI13_cave)C++20
0 / 100
263 ms528 KiB
#include "cave.h"

#include <vector>

using namespace std;

int N;
vector<int> doorOfSwitch; // to what door is switch linked, -1 if not determined
vector<int> switchOfDoor; // to what switch is door linked, -1 if not determined
vector<int> mustBeDown; // i-th switch must be down to open corresponding door, false if not determined

void exploreCave(int n)
{
    N = n;
    doorOfSwitch = vector<int>(N, -1);
    switchOfDoor = vector<int>(N, -1);
    mustBeDown = vector<int>(N, 0);

    // iterating over doors, determining corresponding switches one by one
    for (int i = 0; i < N; ++i)
    {
        // determining is corresponding door switch must be down
        int resSwitchIsUp = tryCombination(mustBeDown.data());
        int switchMustBeDown = !(resSwitchIsUp == -1 || resSwitchIsUp > i + 1);

        // filling a query with known data
        vector<int> query(N);
        for (int j = 0; j < i; ++j) // doors for which we know all info
        {
            query[switchOfDoor[j]] = mustBeDown[switchOfDoor[j]];
        }

        // now determining which exactly switch is corresponding to i-th door
        int l = 0;
        int r = N - 1;
        int switchPos = N - 1;
        while (l <= r)
        {
            int mid = (l + r) / 2;
            for (int j = 0; j <= mid; ++j) // here filling switches with current good, where doorOfSwitch[j] == -1
            {
                if (doorOfSwitch[j] == -1)
                {
                    query[j] = switchMustBeDown;
                }
            }
            for (int j = mid + 1; j < N; ++j) // here filling switches with current bad, where doorOfSwitch[j] == -1
            {
                if (doorOfSwitch[j] == -1)
                {
                    query[j] = !switchMustBeDown;
                }
            }

            int queryRes = tryCombination(query.data());
            if (queryRes == -1 || queryRes > i + 1)
            {
                r = mid - 1;
                switchPos = mid;
            }
            else
            {
                l = mid + 1;
            }
        }

        mustBeDown[switchPos] = switchMustBeDown;
        doorOfSwitch[switchPos] = i;
        switchOfDoor[i] = switchPos;
    }

    answer(doorOfSwitch.data(), mustBeDown.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...