This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define all(x) x.begin(), x.end()
#define sz(x) (int) x.size()
#define endl '\n'
#define pb push_back
#define _ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#include "messy.h"
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ii = pair<int,int>;
using iii = tuple<int,int,int>;
const int inf = 2e9+1;
const int mod = 1e9+7;
const int maxn = 3e5+100;
template<typename X, typename Y> bool ckmin(X& x, const Y& y) { return (y < x) ? (x=y,1):0; }
template<typename X, typename Y> bool ckmax(X& x, const Y& y) { return (x < y) ? (x=y,1):0; }
// vector<int>restore_permutation(int n,int w,int r);
// namespace helper {
// set<string> set_;
// bool compiled = false;
// int n;
// vector<int> p;
// int w;
// int r;
// int read_int() {
// int x;
// cin >> x;
// return x;
// }
// }
// using namespace helper;
// // A convenience function.
// int get_p(int i) {
// int ret = p[i];
// return ret;
// }
// int main() {
// n = read_int();
// w = read_int();
// r = read_int();
// p = vector<int>(n);
// for (int i = 0; i < n; i++) {
// p[i] = read_int();
// }
// vector<int> answer = restore_permutation(n, w, r);
// if (answer.size() != n) {
// printf("WA\n");
// return 0;
// }
// printf("%d", answer[0]);
// for (int i = 1; i < n; i++) {
// printf(" %d", answer[i]);
// }
// printf("\n");
// return 0;
// }
// void wa() {
// printf("WA\n");
// exit(0);
// }
// bool check(const string& x) {
// if ((int)x.length() != n) {
// return false;
// }
// for (int i = 0; i < n; i++) {
// if (x[i] != '0' && x[i] != '1') {
// return false;
// }
// }
// return true;
// }
// void add_element(string x) {
// if (--w < 0 || compiled || !check(x)) {
// wa();
// }
// set_.insert(x);
// }
// bool check_element(string x) {
// if (--r < 0 || !compiled || !check(x)) {
// wa();
// }
// return set_.count(x);
// }
// void compile_set() {
// if (compiled) {
// wa();
// }
// compiled = true;
// 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[get_p(i)];
// }
// compiledSet.insert(compiledElement);
// }
// set_ = compiledSet;
// }
int presente[128][128];
bool mark[128];
vector<int> restore_permutation(int n, int w, int r) {
int logn = 30 - __builtin_clz(n);
for(int bit=logn;~bit;--bit){
string act(n, '0');
for(int i=0;i<n;++i)if(((i>>(bit+1))&1))act[i] = '1';
for(int i=0;i<n;++i){
if(((i>>bit)&1)){
act[i] = '1' - act[i] + '0';
// cout<<"+ "<<act<<endl;
add_element(act);
act[i] = '1' - act[i] + '0';
}
}
}
compile_set();
string last(n,'0');
for(int bit=logn;~bit;--bit){
string nxt(n,'0');
vector<int>taken;
for(int i=0;i<n;++i)mark[i] = 0;
// cout<<"inicio: "<<last<<endl<<endl;
for(int i=0;i<n;++i){
last[i] = '1' - last[i] + '0';
// cout<<"? "<<last<<endl;
if(check_element(last)){
// cout<<" -achei!"<<endl;
mark[i] = 1, nxt[i] = '1';
}
last[i] = '1' - last[i] + '0';
}
for(int i=0;i<n;++i){
if(((i>>bit)&1)){
for(int j=0;j<n;++j)presente[i][j] += mark[j];
}else{
for(int j=0;j<n;++j)presente[i][j] += !mark[j];
}
}
last = nxt;
}
vector<int>resp;
for(int i=0;i<n;++i){
int pi = -1;
for(int j=0;j<n;++j){
if(presente[i][j]==logn+1){
assert(pi==-1);
pi = j;
}
}
assert(pi!=-1);
resp.pb(pi);
}
return resp;
}
# | 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... |