제출 #648592

#제출 시각아이디문제언어결과실행 시간메모리
648592a_aguilo동굴 (IOI13_cave)C++14
100 / 100
887 ms464 KiB
#include "cave.h"
#include<bits/stdc++.h>

using namespace std;

int n;

void applyChanges(int combo[], int l, int r, int setInterrup, int preRequisites[]){
    for(int i = l; i <= r; ++i) combo[i] = setInterrup;
    for(int i = 0; i < n;++i){
        if(preRequisites[i] != -1) combo[i] = preRequisites[i];
    }
}

void exploreCave(int N) {
    /* ... */
    //answer(switches, correspondence)
    n = N;
    int setInterruptors[N];
    memset (setInterruptors, -1, sizeof(setInterruptors));
    int yourInterruptor[N];
    for(int door = 0; door < N; ++door){
        int lo = 0; int hi = N-1;
        int InterruptVal;
        int combo[N];
        memset (combo, 0, sizeof(combo));
        applyChanges(combo, 0, 0, 0, setInterruptors);
        int ans = tryCombination(combo);
        InterruptVal = 0;
        if(ans == -1 or ans > door) InterruptVal = 0;
        else InterruptVal = 1;
        int pos = 0;
        while(lo <= hi){
            int mid = lo + (hi - lo)/2;
            memset(combo, InterruptVal^1, sizeof(combo));
            applyChanges(combo, lo, mid, InterruptVal, setInterruptors);
            ans = tryCombination(combo);
            if(ans == -1 or ans > door){
                hi = mid-1;
                pos = mid;
            }
            else lo = mid+1;
        }
        yourInterruptor[door] = pos;
        setInterruptors[pos] = InterruptVal;
    }
    int interruptToDoor[N];
    for(int i = 0; i < N; ++i){
        interruptToDoor[yourInterruptor[i]] = i;
    }
    answer(setInterruptors, interruptToDoor);
}
#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...