이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <cstdio>
#include <vector>
#include <iostream>
#include "library.h"
using namespace std;
const int MaxN = 1012;
vector <int> g[MaxN];
int n;
vector <int> res;
int sz (vector <int> v) {
int ans = 0;
for (int i : v)
ans += i;
return ans;
}
int get (int x, int l, int r) {
vector <int> W(n);
for (int i = 0; i < n; i++)
W[i] = 0;
for (int i = l - 1; i <= r - 1; i++)
W[i] = 1;
W[x - 1] = false;
int a = (l == r ? 0 : sz(W) - Query(W));
W[x - 1] = 1;
int b = (l == 1 && r == n ? n - 1 : sz(W) - Query(W));
int wef = 0;
for (int u : g[x])
wef += ((u >= l) && (u <= r));
return b - a - wef;
}
void dfs (int v, int p = -1) {
res.push_back(v);
for (int u : g[v])
if (u != p)
dfs (u, v);
}
void Solve(int N)
{
if (N <= 2) {
vector <int> wef(N);
for (int i = 0; i < N; i++)
wef[i] = i + 1;
Answer(wef);
return;
}
n = N;
for (int i = 1; i <= n; i++) {
while ((int)g[i].size() < 2) {
if (g[i].size() == 1 && get (i, 1, n) == 0) {
break;
} else {
int l = 1, r = n;
while (r != l) {
int mid = (l + r) >> 1;
if (get (i, l, mid))
r = mid;
else
l = mid + 1;
}
g[i].push_back(l);
g[l].push_back(i);
}
}
}
int root = 0;
for (int i = 1; i <= n; i++)
if (g[i].size() == 1)
root = i;
dfs (root);
Answer(res);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |