제출 #1146392

#제출 시각아이디문제언어결과실행 시간메모리
1146392daveleUnscrambling a Messy Bug (IOI16_messy)C++20
100 / 100
2 ms584 KiB
#include <vector>
#ifndef davele
#include "messy.h"
#endif // davele

#include <bits/stdc++.h>
#define pii pair<int, int>
#define fi first
#define se second
#define vi vector <int>
#define pq priority_queue
#define MASK(i) (1ll<<(i))
#define BIT(x, i) (((x) >> (i)) & 1)
#define x0 ___x0
#define y0 ___y0
#define div   ___div
#define next   ___next
#define prev   ___prev
#define left   ___left
#define right   ___right
#define pos pisosi
#define pb push_back
#define pf push_front
using namespace std;

//const int mod = ;
//void add (int &a, const int&b){
//    a+=b;
//    if (a>=mod) a-=mod;
//}
//
//void sub (int&a, const int&b){
//    a-=b;
//    if (a<0) a+=mod;
//}
//
//void mul (int&a, const int&b){
//    a*=b;
//    a%=mod;
//}

template<class X, class Y>
    bool minimize(X &x, const Y&y){
        if (x<=y) return false;
        else{
            x = y;
            return true;
        }
    }
template<class X, class Y>
    bool maximize (X &x, const Y&y){
        if (x>=y) return false;
        else{
            x = y;
            return true;
        }
    }

/////////////////////////////////////////////////////////////////////////////////
//const int lim = , limit = , inf = ;


//// dang nhap ham
#ifndef davele
int N;
vector <int> ret;

void dncw (int l, int r){
//    cerr<<l<<" "<<r<<"\n";
    if (l==r) return;
    int mid = (l+r)/2;
    string tmp(N, '1');
    for (int i=l; i<=r; i++) tmp[i] = '0';
    for (int i=l; i<=mid; i++){
        tmp[i] = '1';
        add_element(tmp);
        tmp[i] = '0';
    }
    dncw (l, mid);
    dncw(mid+1, r);
}

void dncr (int l, int r, vi&pos){
//    cerr<<l<<" "<<r<<":\n";
//    for (int x:pos) cerr<<x<<" ";
//    cerr<<"\n";
    if (l==r){
//        cerr<<l<<" "<<pos[0]<<"\n";
//        cerr<<pos.size()<<"\n";
        ret[pos[0]] = l;
        return;
    }
    string tmp (N, '1');
    for (int x:pos) tmp[x]='0';
    vector <int> left, right;
    for (int i=0; i<pos.size(); i++){
        tmp[pos[i]]='1';
//        cerr<<" "<<pos[i]<<" "<<tmp<<"\n";
        if (check_element(tmp)){
//            cerr<<"a\n";
            left.pb(pos[i]);
        }
        else right.pb(pos[i]);
        tmp[pos[i]]='0';
    }
    int mid = (l+r)/2;
//    cerr<<l<<" "<<r<<" "<<mid<<"   "<<left.size()<<" "<<right.size()<<"\n";
    dncr (l, mid, left);
    dncr (mid+1, r, right);
}

vector<int> restore_permutation(int n, int w, int r) {
    N = n;
    for (int i=0; i<n; i++) ret.pb(-1);
    dncw(0, n-1);
//    cerr<<"ok";
    vector <int> ac;
    for (int i=0; i<n; i++) ac.pb(i);
//    cerr<<"ok";
    compile_set();
    dncr(0, n-1, ac);
    return ret;
}

#endif // davele
//
//// chay thu ham main:
//
#ifdef davele


int n, w, r;
int p[1005];
set <string> set_;

void add_element(string x) {
//    cerr<<x<<"\n";
    set_.insert(x);
}

bool check_element(string x) {
//    cerr<<"b "<<x<<" "<<set_.count(x)<<"\n";
    return set_.count(x);
}

void compile_set() {
    set<string> compiledSet;
    string compiledElement = string(n, ' ');
    for (set<string>::iterator it = set_.begin(); it != set_.end(); it++) {
        string s = *it;
        for (int i = 0; i < n; i++) {
            compiledElement[i] = s[p[i]];
        }
//        cerr<<s<<" "<<compiledElement<<"\n";
        compiledSet.insert(compiledElement);
    }
    set_ = compiledSet;
//    cerr<<set_.size()<<"\n";
//    for (string x:set_) cerr<<x<<" ";
//    cerr<<"\n";
}

int N;
vector <int> ret;

void dncw (int l, int r){
//    cerr<<l<<" "<<r<<"\n";
    if (l==r) return;
    int mid = (l+r)/2;
    string tmp(N, '1');
    for (int i=l; i<=r; i++) tmp[i] = '0';
    for (int i=l; i<=mid; i++){
        tmp[i] = '1';
        add_element(tmp);
        tmp[i] = '0';
    }
    dncw (l, mid);
    dncw(mid+1, r);
}

void dncr (int l, int r, vi&pos){
//    cerr<<l<<" "<<r<<":\n";
//    for (int x:pos) cerr<<x<<" ";
//    cerr<<"\n";
    if (l==r){
//        cerr<<l<<" "<<pos[0]<<"\n";
//        cerr<<pos.size()<<"\n";
        ret[pos[0]] = l;
        return;
    }
    string tmp (N, '1');
    for (int x:pos) tmp[x]='0';
    vector <int> left, right;
    for (int i=0; i<pos.size(); i++){
        tmp[pos[i]]='1';
//        cerr<<" "<<pos[i]<<" "<<tmp<<"\n";
        if (check_element(tmp)){
//            cerr<<"a\n";
            left.pb(pos[i]);
        }
        else right.pb(pos[i]);
        tmp[pos[i]]='0';
    }
    int mid = (l+r)/2;
//    cerr<<l<<" "<<r<<" "<<mid<<"   "<<left.size()<<" "<<right.size()<<"\n";
    dncr (l, mid, left);
    dncr (mid+1, r, right);
}

vector<int> restore_permutation(int n, int w, int r) {
    N = n;
    for (int i=0; i<n; i++) ret.pb(-1);
    dncw(0, n-1);
//    cerr<<"ok";
    vector <int> ac;
    for (int i=0; i<n; i++) ac.pb(i);
//    cerr<<"ok";
    compile_set();
    dncr(0, n-1, ac);
    return ret;
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    //

//    freopen (".inp", "r", stdin);
//    freopen (".out", "w", stdout);
    cin>>n>>w>>r;
    for (int i=0; i<n; i++) cin>>p[i];
    vi tmp = restore_permutation(n, w, r);
    for (int x:tmp) cout<<x<<" ";

}
#endif // davele

////////////////////////////////////////////////////////////////////////////




컴파일 시 표준 에러 (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...