제출 #1024950

#제출 시각아이디문제언어결과실행 시간메모리
1024950TonylUnscrambling a Messy Bug (IOI16_messy)C++17
38 / 100
1 ms604 KiB
#include <vector>
#include "messy.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vi = vector<int>;
#define REP(i,n) for (int i = 0; i < n; i++)
#define all(x) (x).begin(), (x).end()
#define trav(x) for (auto &a : x)
#define D(x) cerr << #x << ": " << x << endl;

int n;

vi perm; // from where?
vi to;

vi shfl;
vi antishfl;

vector<char> reor(vector<char>& vc) {
    vector<char> cp(n);
    REP(i,n) {
        cp[i] = vc[shfl[i]];
        //cerr << cp[i];
    }
    //cerr << endl;
    return cp;
}

vector<int> reor(vector<int>& vc) {
    vector<int> cp(n);
    REP(i,n) {
        cp[i] = vc[shfl[i]];
        //cerr << cp[i];
    }
    //cerr << endl;
    return cp;
}

vi antireor(vector<int>& nums) {
    vi cp(n);
    REP(i,n) {
        cp[shfl[i]] = nums[i];
    }
    return cp;
}

vi anti(vi nums) {
    vi cp(n);
    REP(i,n) {
        cp[nums[i]] = i;
    }
    return cp;
}

bool check(vector<char>& vc) {
    vector<char> cp = reor(vc);
    return check_element(string(all(cp)));
}

void add(vector<char>& vc) {
    vector<char> cp = reor(vc);
    add_element(string(all(cp)));
}

void prep_learn(int am) {
    vector<char> st(n, '0');
    REP(i,am) {
        st[i] = '1';
        add(st);
    }
}

void learn_brute(int am) {
    vector<char> st(n, '0');
    REP(i,am) {
        REP(j,n) {
            if (st[j] == '1') continue;
            st[j] = '1';
            if (check(st)) {
                to[i] = j;
                perm[antishfl[j]] = antishfl[i];
                break;
            } else st[j] = '0';
        }
    }
}

std::vector<int> restore_permutation(int n_, int w, int r) {
    n = n_;
    perm = vi(n,-1); to = vi(n,-1);
    shfl = vi(n); iota(all(shfl), 0);
    random_shuffle(all(shfl));
    antishfl = anti(shfl);
        
    prep_learn(n);
    compile_set();
    learn_brute(n);
    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...