Submission #374998

#TimeUsernameProblemLanguageResultExecution timeMemory
374998Alex_tz307동굴 (IOI13_cave)C++17
100 / 100
1056 ms768 KiB
#include <bits/stdc++.h>
#include "cave.h"

using namespace std;

const int NMAX = 5000;
int states[NMAX], doors[NMAX], query_states[NMAX];
bool found[NMAX];

bool opens(int ans, int door) {
    if(ans == -1)
        return true;
    return ans > door;
}

void exploreCave(int N) {
    for(int i = 0; i < N; ++i) { /// fixez usa
        for(int j = 0; j < N; ++j)
            if(found[j])
                query_states[j] = states[j]; /// continuitatea se mentine pentru ca pana la usa i am aflat raspunsurile, deci ma pot asigura ca pot ajunge cu usi deschise pana aici
            else
                query_states[j] = 1;
        int ans = tryCombination(query_states);
        bool switch_state = opens(ans, i); /// aflu ce stare are switch-ul usii
        int st = 0, dr = N - 1;
        while(st < dr) { /// caut switch-ul
            int mid = (st + dr) >> 1;
            for(int j = 0; j < N; ++j)
                if(found[j]) /// daca switch-ul e de la o usa aflata pana acum procedez analog anterior
                    query_states[j] = states[j];
                else
                    if(st <= j && j <= mid) /// in prima jumatate pun starea switch-ului usii
                        query_states[j] = switch_state;
                else
                    query_states[j] = switch_state ^ 1; /// in a doua invers
            int ans = tryCombination(query_states);
            if(opens(ans, i)) /// daca switch-ul ce deschide usa e in prima jumatate o iau la stanga
                dr = mid;
            else
                st = mid + 1; /// altfel o iau la dreapta
        }
        /// am gasit switch-ul, deci marchez ca l-am gasit, ce stare are si ce usa actioneaza
        found[st] = true, states[st] = switch_state, doors[st] = i;
    }
    answer(states, doors);
}
#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...