Submission #1347660

#TimeUsernameProblemLanguageResultExecution timeMemory
1347660biankUnscrambling a Messy Bug (IOI16_messy)C++20
100 / 100
1 ms580 KiB
#include <bits/stdc++.h>

using namespace std;

using vi = vector<int>;
using ii = pair<int, int>;
using vb = vector<bool>;

#define forn(i, n) for (int i = 0; i < int(n); i++)
#define forsn(i, s, n) for (int i = int(s); i < int(n); i++)

#define sz(x) int(x.size())
#define all(x) begin(x), end(x)

#define pb push_back

void add_element(string x);
bool check_element(string x);
void compile_set();

void init(int l, int r, string base) {
    if (r - l == 1) return;
    int m = (l + r) / 2;
    forsn(i, l, m) {
        string s = base; s[i] = '1';
        add_element(s);
    }
    string leftBase = base, rightBase = base;
    forsn(i, m, r) leftBase[i] = '1';
    forsn(i, l, m) rightBase[i] = '1';
    init(l, m, leftBase);
    init(m, r, rightBase);
}

void solve(int l, int r, string base, vi &indices, vi &perm) {
    if (r - l == 1) {
        assert(sz(indices) == 1);
        perm[indices[0]] = l;
        return;
    }
    vi zeros, ones;
    for (int i : indices) {
        string s = base; s[i] = '1';
        if (check_element(s)) ones.pb(i);
        else zeros.pb(i);
    }
    string leftBase = base, rightBase = base;
    for (int i : zeros) leftBase[i] = '1';
    for (int i : ones) rightBase[i] = '1';
    int m = (l + r) / 2;
    solve(l, m, leftBase, ones, perm);
    solve(m, r, rightBase, zeros, perm);
}

vi restore_permutation(int n, int w, int r) {
    string base(n, '0');
    init(0, n, base);
    vi perm(n);
    vi indices(n);
    iota(all(indices), 0);
    compile_set();
    solve(0, n, base, indices, perm);
    return perm;
}
#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...