Submission #1347253

#TimeUsernameProblemLanguageResultExecution timeMemory
1347253kantaponzUnscrambling a Messy Bug (IOI16_messy)C++20
100 / 100
1 ms580 KiB
#include <vector>
#include <bits/stdc++.h>
using namespace std;

#include "messy.h"

const int nx = 128;

int n, l[nx], r[nx];

void process(int ll, int rr) {
    if (ll >= rr) return;
    int mid = (ll + rr) >> 1;
    string s;
    s.resize(n, '1');
    for (int i = ll; i <= rr; i++) s[i] = '0';
    for (int i = ll; i <= mid; i++) {
        s[i] = '1';
        add_element(s);
        s[i] = '0';
    }
    process(ll, mid);
    process(mid + 1, rr);
}

vector<int> restore_permutation(int nn, int write, int read) {
    n = nn;
    fill(r, r + n, n - 1);
    process(0, n - 1);
    //cout << "sum1\n";
    compile_set();

    //cout << "sum2\n";
    while (1) {
        bool upd = 0;
        vector<int> qrs[n];
        for (int i = 0; i < n; i++) {
            if (l[i] != r[i]) qrs[(l[i]+r[i])>>1].emplace_back(i), upd = 1;
        }
        if (!upd) break;
        for (int mid = 0; mid < n; mid++) {
            for (auto idx : qrs[mid]) {
                string s; s.resize(n, '0');
                for (int i = 0; i < n; i++) {
                    if (l[i] > r[idx] || r[i] < l[idx]) s[i] = '1';
                }
                s[idx] = '1';
                //cout << s << "\n";
                bool x = check_element(s);
                //cout << "sum3\n";
                if (x) r[idx] = mid;
                else l[idx] = mid + 1;
            }
        }
    }
    vector<int> ans(n);
    for (int i = 0; i < n; i++) {
        ans[i] = l[i];
        //assert(cout << l[i] << " ");
    }
    return ans;
}
#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...