| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1340482 | 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>;
// void add_element(string s) { cout << "+ " << s << endl; }
// void compile_set() {}
// bool check_element(string s) { cout << "? " << s << endl; int res; cin >> res; return res; }
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[l] = cand[0];
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;
}
