Submission #1261939

#TimeUsernameProblemLanguageResultExecution timeMemory
1261939sokratisiCave (IOI13_cave)C++20
100 / 100
169 ms820 KiB
#include "cave.h"
#include <bits/stdc++.h>

using namespace std;

set<int> use;
int n;

pair<int, int> bsearch(int i, int s[]) {
    vector<int> t;
    for (auto u: use) t.push_back(u);

    int cntrl = tryCombination(s);
    if (cntrl == -1) cntrl = n+2;

    int l = 0, r = t.size()-1;
    while(l < r) {
        int m = (l + r) / 2;
        int ts[n];
        for (int i = 0; i < n; i++) ts[i] = s[i];
        for (int i = l; i <= m; i++) {
            ts[t[i]] = 1-ts[t[i]];
        }
        int ans = tryCombination(ts);
        if (ans == -1) ans = n + 2;
        if (cntrl == i && ans > i) r = m;
        else if (cntrl > i && ans == i) r = m;
        else l = m + 1;
    }
    int corpos;
    if (cntrl > i) corpos = s[t[l]];
    else corpos = 1 - s[t[l]];
    return {t[l], corpos};
}

void exploreCave(int x) {
    n = x;
    int s[n], d[n];
    for (int i = 0; i < n; i++) s[i] = 0;
    for (int i = 0; i < n; i++) use.insert(i);
    for (int i = 0; i < n; i++) {
        pair<int, int> ans = bsearch(i, s);
        use.erase(ans.first);
        s[ans.first] = ans.second;
        d[ans.first] = i;
    }
    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...