Submission #221218

#TimeUsernameProblemLanguageResultExecution timeMemory
221218emil_physmathUnscrambling a Messy Bug (IOI16_messy)C++17
100 / 100
8 ms768 KiB
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include "messy.h"
using namespace std;
const int bits = 7;
const int maxN = 1 << bits;

int n;
int p[maxN];

map<string, bool> cache;
bool Query(const string& a)
{
    auto it = cache.find(a);
    if (it != cache.end())
        return it->second;
    return cache[a] = check_element(a);
}
void Add(int l, int r)
{
    if (l == r)
        return;
    for (int i = l; i <= (l + r) / 2; ++i)
    {
        string add(n, '1');
        for (int j = l; j <= r; ++j)
            add[j] = '0';
        add[i] = '1';
        add_element(add);
    }
    Add(l, (l + r) / 2);
    Add((l + r) / 2 + 1, r);
}
void Get(int curind, int bit)
{
    if (!bit)
        return;
    string q(n, '1');
    for (int j = 0; j < n; ++j)
        if (p[j] == curind)
            q[j] = '0';
    for (int i = 0; i < n; ++i)
    {
        if (p[i] != curind) continue;
        string curq = q;
        curq[i] = '1';
        if (!Query(curq))
            p[i] = curind + bit;
    }
    Get(curind, bit >> 1);
    Get(curind + bit, bit >> 1);
}
vector<int> restore_permutation(int n_, int w, int r) {
    n = n_;
    Add(0, n - 1);
    compile_set();
    Get(0, 1 << (__lg(n) - 1));
    return vector<int>(p, p + n);
}
#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...