Submission #1302635

#TimeUsernameProblemLanguageResultExecution timeMemory
1302635FaggiUnscrambling a Messy Bug (IOI16_messy)C++20
100 / 100
2 ms588 KiB
#include <bits/stdc++.h>
#define ll long long
#define sz(x) int(x.size())
#define forn(i, n) for (i = 0; i < n; i++)
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define fr first
#define se second
using namespace std;

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

ll N;

void div(vector<ll> &v, vector<ll> &iz, vector<ll> &der)
{
    ll i, n = sz(v);
    for (i = 0; i < n / 2; i++)
        iz.pb(v[i]);
    for (i = n / 2; i < n; i++)
        der.pb(v[i]);
}

void insert(vector<ll> iz, vector<ll> der)
{
    ll i;
    vector<ll> I, D;
    string bits;
    if (sz(iz) == 2)
    {
        bits = "";
        bits.resize(N, '1');
        bits[iz[0]] = '0';
        add_element(bits);
        return;
    }
    bits = "";
    bits.resize(N, '0');
    for (i = 0; i < sz(der); i++)
        bits[der[i]] = '1';

    for (i = 0; i < sz(iz) / 2; i++)
    {
        bits[iz[i]] = '1';
        add_element(bits);
        bits[iz[i]] = '0';
    }
    div(iz, I, D);
    insert(I, D);
    insert(D, I);
}

vector<int> ans;

void search(vector<ll> iz, vector<ll> der, vector<ll> pos, bool in = 0)
{
    string bits;
    ll i;
    vector<ll> I, D, PI, PD;
    if (in)
    {
        bits = "";
        bits.resize(N, '0');
        for (i = 0; i < N; i++)
        {
            bits[iz[i]] = '1';
            if (check_element(bits))
                I.pb(iz[i]);
            else
                D.pb(iz[i]);
            bits[iz[i]] = '0';
        }
    }
    else
    {
        if (sz(iz) == 2)
        {
            bits = "";
            bits.resize(N, '1');
            bits[iz[0]] = '0';
            if (!check_element(bits))
                swap(iz[0], iz[1]);
            ans[iz[0]] = pos[0];
            ans[iz[1]] = pos[1];
            return;
        }
        bits = "";
        bits.resize(N, '0');
        for (i = 0; i < sz(der); i++)
            bits[der[i]] = '1';
        for (i = 0; i < sz(iz); i++)
        {
            bits[iz[i]] = '1';
            if (check_element(bits))
                I.pb(iz[i]);
            else
                D.pb(iz[i]);
            bits[iz[i]] = '0';
        }
    }
    div(pos, PI, PD);
    search(I, D, PI);
    search(D, I, PD);
}

std::vector<int> restore_permutation(int n, int w, int r)
{

    vector<ll> iz, der;
    ll i;
    N = n;
    ans.resize(n);
    vector<ll> v(n), vacio;
    for (i = 0; i < n; i++)
        v[i] = i;
    insert(v, vacio);
    compile_set();
    search(v, vacio, v, 1);
    return ans;
}

Compilation message (stderr)

messy.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
messy_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...