제출 #766844

#제출 시각아이디문제언어결과실행 시간메모리
766844Dorost도서관 (JOI18_library)C++17
100 / 100
296 ms460 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...