제출 #556134

#제출 시각아이디문제언어결과실행 시간메모리
556134ljuba동굴 (IOI13_cave)C++17
100 / 100
1256 ms468 KiB
#include "cave.h"
#include <bits/stdc++.h>

int n;

using namespace std;

void exploreCave(int N) {
    /* ... */
    n = N;

    int okidac[n];
    int gde[n]; //okidac na itom mestu pokazuje na vrata gde[i]
    bool marked[n];

    for(int i = 0; i < n; ++i) {
        marked[i] = false;
        gde[i] = 3*n;
    }

    for(int iter = 0; iter < n; ++iter) {
        int trenutni[n];

        for(int i = 0; i < n; ++i) {
            trenutni[i] = 0;
        }

        for(int i = 0; i < n; ++i) {
            if(gde[i] < iter) {
                trenutni[i] = okidac[i];
            }
        }

        int odg = tryCombination(trenutni);

        int x;

        if(odg == -1 || odg > iter) {
            x = 0;
        } else {
            x = 1;
        }

        int l = 1, r = n - iter;
        int zapravoGde = -1;
        int ans = -1;

        while(l <= r) {
            int mid = (l + r) / 2;

            for(int i = 0; i < n; ++i) {
                trenutni[i] = x ^ 1;
            }

            for(int i = 0; i < n; ++i) {
                if(gde[i] < iter) {
                    trenutni[i] = okidac[i];
                }
            }

            int uzeli = 0;
            for(int i = 0; i < n; ++i) {
                if(marked[i]) continue;
                ++uzeli;
                trenutni[i] = x;
                if(uzeli == mid) {
                    zapravoGde = i;
                    break;
                }
            }

            // if(l == r) break;

            odg = tryCombination(trenutni);

            // cerr << l << " " << r << " ";
            // cerr << "(" << iter << ", " << mid << "):";
            // for(int i = 0; i < n; ++i) cerr << " " << trenutni[i];
            // cerr << " -> " << odg << endl;

            if(odg == -1 || odg > iter) {
                ans = zapravoGde;
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        }

        gde[ans] = iter;
        okidac[ans] = x;
        marked[ans] = true;
    }

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