이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "messy.h"
template <class T>
using Vec = std::vector<T>;
Vec<int> restore_permutation(int n, int w, int r) {
{
std::queue<std::pair<int, int>> que;
que.emplace(0, n);
while (!que.empty()) {
const auto left = que.front().first;
const auto right = que.front().second;
que.pop();
if (right - left == 1) {
continue;
}
const auto mid = (left + right) / 2;
std::string add(n, '1');
std::fill(add.begin() + left, add.begin() + right, '0');
for (int i = mid; i < right; ++i) {
add[i] = '1';
add_element(add);
add[i] = '0';
}
que.emplace(left, mid);
que.emplace(mid, right);
}
}
compile_set();
Vec<int> ret(n);
{
std::queue<std::tuple<int, int, Vec<int>>> que;
{
Vec<int> tmp(n);
std::iota(tmp.begin(), tmp.end(), 0);
que.emplace(0, n, std::move(tmp));
}
while (!que.empty()) {
const auto left = std::get<0>(que.front());
const auto right = std::get<1>(que.front());
const auto idx = std::get<2>(que.front());
que.pop();
if (right - left == 1) {
for (const auto i: idx) {
ret[i] = left;
}
continue;
}
std::string check(n, '1');
for (const auto x: idx) {
check[x] = '0';
}
const auto mid = (left + right) / 2;
Vec<int> v1, v2;
for (const auto x: idx) {
check[x] = '1';
if (check_element(check)) {
v2.push_back(x);
}
else {
v1.push_back(x);
}
check[x] = '0';
}
que.emplace(left, mid, std::move(v1));
que.emplace(mid, right, std::move(v2));
}
}
return ret;
}
# | 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... |