Submission #1076502

#TimeUsernameProblemLanguageResultExecution timeMemory
1076502juicyCave (IOI13_cave)C++17
100 / 100
254 ms856 KiB
#include "cave.h"

#include <bits/stdc++.h>

int S[5000], D[5000], q[5000];
bool taken[5000];

void exploreCave(int N) {
    memset(S, -1, sizeof(S));
    auto flip = [&]() {
        for (int i = 0; i < N; ++i) {
            if (S[i] == -1) {
                q[i] ^= 1;
            }
        }
    };
    int mi = 0;
    auto search = [&]() {
        while (taken[mi]) {
            mi++;
        }
        std::vector<int> cands;
        for (int i = 0; i < N; ++i) {
            if (S[i] != -1) {
                q[i] = S[i];
            } else {
                cands.push_back(i);
                q[i] = 0;
            }
        }
        bool b = 0;
        if (tryCombination(q) == mi) {
            flip();
            b = 1;
        }
        int l = 0, r = cands.size() - 1, p = -1;
        while (l <= r) {
            int md = (l + r) / 2;
            for (int i = 0; i <= md; ++i) {
                q[cands[i]] ^= 1;
            } 
            if (tryCombination(q) == mi) {
                p = md;
                r = md - 1;
            } else {
                l = md + 1;
            }
            for (int i = 0; i <= md; ++i) {
                q[cands[i]] ^= 1;
            }
        }
        S[cands[p]] = b;
        D[cands[p]] = mi;
        taken[mi] = 1;
    };
    int cnt = 0;
    while (cnt++ < N) {
        search();
    }
    answer(S, D);
}
#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...