#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
////////////////////////////////////////////////////////////////////////////
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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |