이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "doll.h"
#include <functional>
std::vector<int> get_rev(int n)
{
std::vector<int> rev(n);
rev[n - 1] = n - 1;
for (int i = 1, j = n >> 1; i + 1 < n; i++)
{
rev[i] = j;
int k = n >> 1;
while (j & k)
{
j ^= k;
k >>= 1;
}
j |= k;
}
return rev;
}
void create_circuit(int m, std::vector<int> arr)
{
int n = arr.size(), len = 1;
arr.push_back(0);
while (len < n)
len <<= 1;
auto rev = get_rev(len);
std::vector<int> seq(len, -1), idx(len), X, Y;
for (int i = len - n; i < len; i++)
seq[rev[i]] = i;
for (int i = 0, j = 0; i < len; i++)
{
if (~seq[i])
idx[seq[i]] = ++j;
}
std::function<int (int, int)> solve = [&] (int l, int r) -> int
{
if (l == r)
return l >= len - n ? arr[idx[l]] : m + 1;
int mid = l + r >> 1;
int lson = solve(l, mid), rson = solve(mid + 1, r);
if (lson == m + 1 && rson == m + 1)
return m + 1;
X.push_back(lson);
Y.push_back(rson);
return -X.size();
};
int rt = solve(0, len - 1);
std::vector<int> C(m + 1, rt);
C[0] = arr[0];
auto trans = [&] (std::vector<int> &vec)
{
for (auto &i : vec)
{
if (i == m + 1)
i = rt;
}
};
trans(X);
trans(Y);
answer(C, X, Y);
}
컴파일 시 표준 에러 (stderr) 메시지
doll.cpp: In lambda function:
doll.cpp:39:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
39 | int mid = l + r >> 1;
| ~~^~~
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |