| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1340484 | SulA | Unscrambling a Messy Bug (IOI16_messy) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#define all(a) (a).begin(), (a).end()
#define popcount __builtin_popcountll
using namespace std;
using namespace __gnu_pbds;
template<typename T> using ordered_set = tree<T, null_type, less_equal<>, rb_tree_tag, tree_order_statistics_node_update>;
// vector<int> P(128);
// void init() {
// for (int i = 0; i < 128; i++)
// P[i] = (i + 1) % 128;
// }
// string apply(string s) {
// string t(128, ' ');
// for (int i = 0; i < 128; i++)
// t[i] = s[P[i]];
// return t;
// }
// set<string> strs;
// int reads = 0;
// void add_element(string s) { strs.insert(apply(s)); }
// void compile_set() {}
// bool check_element(string s) { reads++; return strs.count(s); }
void insert(int l, int r, string& num) {
if (l+1 == r) return;
int mid = (l+r)/2;
for (int i = l; i < mid; i++) {
num[i] = '1';
add_element(num);
num[i] = '0';
}
for (int i = l; i < r; i++) {
num[i] = i < mid ? '0' : '1';
}
insert(l, mid, num);
for (int i = l; i < r; i++) {
num[i] = i < mid ? '1' : '0';
}
insert(mid, r, num);
for (int i = l; i < r; i++)
num[i] = '0';
}
vector<int> p;
void restore(int l, int r, string& num, vector<int> cand) {
if (r-l == 1) {
p[cand[0]] = l;
return;
}
int mid = (l+r)/2;
vector<int> left, right;
for (int x : cand) {
num[x] = '1';
int res = check_element(num);
(res ? left : right).push_back(x);
num[x] = '0';
}
for (int i : right) num[i] = '1';
restore(l, mid, num, left);
for (int i : right) num[i] = '0';
for (int i : left) num[i] = '1';
restore(mid, r, num, right);
for (int i : left) num[i] = '0';
}
vector<int> restore_permutation(int n, int w, int r) {
string num(n, '0');
insert(0, n, num);
compile_set();
vector<int> cand(n);
iota(all(cand), 0);
p.resize(n);
restore(0, n, num, cand);
return p;
}
