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 <vector>
#include <bits/stdc++.h>
#include "messy.h"
using namespace std;
void ADDELEM(vector<bool> a) {
string s;
for (bool i: a) {
if (i) s.push_back('1');
else s.push_back('0');
}
// cerr << "added: " << s << "\n";
add_element(s);
}
map<string, int> dict;
bool CHECKELEM(vector<bool> a) {
string s;
for (bool i: a) {
if (i) s.push_back('1');
else s.push_back('0');
}
if (dict.count(s) != 0) return dict[s];
bool res = check_element(s);
// cerr << "checked: " << s << ": " << (int)res << "\n";
return dict[s] = res;
}
std::vector<int> restore_permutation(int n, int w, int r) {
dict.clear();
// assert(n==128);
int l = log2(n);
vector<bool> mask(n, 0);
for (int i = l-1; i>=0; i--) {
vector<bool> add = mask;
// if (i == 0) {
// for (int j = 0; j<n; j++) add[j] = !add[j];
// }
for (int j = 0; j<n; j++) {
if ((j & (1<<i)) == 0) {
add[j] = !add[j];
mask[j] = 1;
ADDELEM(add);
add[j] = !add[j];
}
}
}
vector<bool> lastOne(n, 0);
lastOne[0] = 1;
lastOne[n-3] = 1;
ADDELEM(lastOne);
compile_set();
vector<int> res(n);
mask.assign(n, 0);
for (int i = l-1; i>=0; i--) {
vector<bool> add = mask;
// if (i == 0) {
// for (int j = 0; j<n; j++) add[j] = !add[j];
// }
for (int j = 0; j<n; j++) {
add[j] = !add[j];
int tmpResp = CHECKELEM(add);
add[j] = !add[j];
if (tmpResp) {
mask[j] = 1;
}
else {
res[j] += 1<<i;
}
}
}
int indexOfFirst;
for (int i = 0; i<n; i++) {
// cerr << res[i] << " ";
if(res[i] == 0) {
indexOfFirst = i;
}
}
// cerr << "\n";
vector<int> badIndicies;
for (int i = 0; i<n; i++) {
if(res[i] == n-4) {
badIndicies.push_back(i);
}
}
// cerr << badIndicies[0] << " " << badIndicies[1] << "\n";
// assert(badIndicies.size() == 2);
vector<bool> ask(n, 0);
// cerr << indexOfFirst << "\n";
ask[indexOfFirst] = 1;
ask[badIndicies[0]] = 1;
if (CHECKELEM(ask)) res[badIndicies[0]]++;
else res[badIndicies[1]]++;
return res;
}
Compilation message (stderr)
messy.cpp: In function 'bool CHECKELEM(std::vector<bool>)':
messy.cpp:39:20: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
39 | return dict[s] = res;
# | 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... |