제출 #1360701

#제출 시각아이디문제언어결과실행 시간메모리
1360701pcheloveksCave (IOI13_cave)C++20
100 / 100
111 ms608 KiB
#include "cave.h"

#include <bits/stdc++.h>

using namespace std;

const int DIM = 5007;

vector < int > undetermined;
int S[DIM], D[DIM];

int comb[DIM];

void exploreCave(int N) {

    for(int i = 0; i < N; i++) {
        S[i] = -1; D[i] = -1;
        undetermined.push_back(i);
    }

    int firstDoor = 0;

    while(undetermined.size() > 0) {
        for(int i = 0; i < N; i++) {
            if(S[i] != -1) comb[i] = S[i];
            else comb[i] = 0;
        }

        int door = tryCombination(comb);

        if(door == firstDoor) {
            // firstDoor --- open

            int L = -1, R = undetermined.size();
            while(R - L > 1) {
                int mid = (L + R) >> 1;

                for(int i = 0; i <= mid; i++) comb[undetermined[i]] = 1;
                for(int i = mid + 1; i < undetermined.size(); i++) comb[undetermined[i]] = 0;

                door = tryCombination(comb);

                if(door == firstDoor) L = mid;
                else R = mid;
            }

            D[undetermined[R]] = firstDoor;
            S[undetermined[R]] = 1;

            vector < int > tmp;
            for(int i = 0; i < undetermined.size(); i++) {
                if(i == R) continue;
                tmp.push_back(undetermined[i]);
            }
            undetermined = tmp;
        }
        else {
            // firstDoor --- closed

            int L = -1, R = undetermined.size();
            while(R - L > 1) {
                int mid = (L + R) >> 1;

                for(int i = 0; i <= mid; i++) comb[undetermined[i]] = 1;
                for(int i = mid + 1; i < undetermined.size(); i++) comb[undetermined[i]] = 0;

                door = tryCombination(comb);

                if(door != firstDoor) L = mid;
                else R = mid;
            }

            D[undetermined[R]] = firstDoor;
            S[undetermined[R]] = 0;

            vector < int > tmp;
            for(int i = 0; i < undetermined.size(); i++) {
                if(i == R) continue;
                tmp.push_back(undetermined[i]);
            }
            undetermined = tmp;
        }
        firstDoor++;
    }

    answer(S, D);
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…