Submission #1233164

#TimeUsernameProblemLanguageResultExecution timeMemory
1233164AMel0nUnscrambling a Messy Bug (IOI16_messy)C++20
100 / 100
1 ms584 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
#define FOR(i,N) for(ll i = 0; i < N; i++)
#define all(x) (x).begin(), (x).end()
#define F first
#define S second

#include "messy.h"

int n;
vector<unordered_set<int>> v;
vector<int> res;

void add(int l, int r) { // incl, incl
    if (l == r) return ;

    string x(n, '0');
    FOR(i, n) if (i < l || i > r) x[i] = '1';

    int m = (l + r) / 2;
    for(int i = l; i <= m; i++) { // l->m (not l->r)
        x[i] = '1';
        add_element(x);
        x[i] = '0';
    }

    add(l, m);
    add(m+1, r);
}

void check(int l, int r, int iv) { // incl, incl, segtree indexing
    if (l == r) {
        res[*v[iv].begin()] = l;
        return ;
    }

    string x(n, '0');
    FOR(i, n) if (v[iv].find(i) == v[iv].end()) x[i] = '1';

    for(auto i: v[iv]) {
        x[i] = '1';
        if (check_element(x)) {
            v[iv * 2].insert(i);
        } else {
            v[iv * 2 + 1].insert(i);
        }
        x[i] = '0';
    }

    check(l, (l+r) / 2, iv * 2);
    check((l+r) / 2 + 1, r, iv * 2 + 1);
}

vector<int> restore_permutation(int n, int w, int r) {
    ::n = n;
    add(0, n-1);

    compile_set();

    v.resize(n*4);
    res.resize(n);
    FOR(i, n) v[1].insert(i);
    check(0,n-1,1);

    return res;
}

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...