제출 #1282718

#제출 시각아이디문제언어결과실행 시간메모리
1282718nikaa123Park (JOI17_park)C++17
0 / 100
2 ms572 KiB
#include "park.h"
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1505;
int f[MAXN];
int n;
static int p[MAXN];

vector<int> lst, nodes, vis(MAXN);
vector<vector<int>> v(MAXN);

void colect(int x) {
    if (vis[x]) return;
    nodes.push_back(x);
    vis[x] = 1;
    vector<int> children = v[x];
    sort(children.begin(), children.end()); // deterministic traversal
    for (auto to : children) {
        if (f[to] && !vis[to]) colect(to);
    }
}

void dfs(int x, int node) {
    sort(v[x].begin(), v[x].end()); // deterministic
    while (true) {
        if (vis[x]) return;
        nodes.clear();
        for (int i = 0; i < n; ++i) vis[i] = 0;
        colect(x);
        if (nodes.empty()) return; // safety
        for (int i = 0; i < n; i++) p[i] = 0;
        for (auto to : nodes) p[to] = 1;
        p[node] = p[x] = 1;

        if (!Ask(min(node, x), max(node, x), p)) return;

        int l = 0, r = (int)nodes.size() - 1;
        int res = -1;
        while (l <= r) {
            int mid = (l + r) / 2;
            for (int i = 0; i < n; ++i) p[i] = 0;
            for (int i = 0; i <= mid; ++i) p[nodes[i]] = 1;
            p[node] = p[x] = 1;
            if (Ask(min(node, x), max(node, x), p)) {
                res = nodes[mid];
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        }

        if (res == -1) return; // safety
        vis[res] = 1;
        lst.push_back(res);
        for (auto to : v[res]) {
            dfs(to, node);
        }
    }
}

void explore(int x) {
    if (f[x]) return;

    for (int i = 0; i < n; i++) p[i] = f[i];
    p[x] = 1;
    p[0] = 1;

    while (!Ask(0, x, p)) {
        int l = 0, r = n - 1, res = -1;
        while (l <= r) {
            int mid = (l + r) / 2;
            for (int i = 0; i < n; ++i)
                p[i] = (f[i] || i <= mid) ? 1 : 0;
            p[x] = 1;
            p[0] = 1;
            if (Ask(0, x, p)) {
                res = mid;
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        }
        if (res < 0 || res >= n) return; // safety
        explore(res);
    }

    for (int i = 0; i < n; ++i) vis[i] = 0;
    lst.clear();
    dfs(0, x);

    for (auto u : lst) {
        Answer(min(u, x), max(u, x));
    }
    if (!lst.empty()) v[lst[0]].push_back(x);
    f[x] = 1;
}

void Detect(int T, int N) {
    n = N;
    for (int i = 0; i < MAXN; i++) {
        f[i] = 0;
        p[i] = 0;
        vis[i] = 0;
        v[i].clear();
    }
    f[0] = 1;
    for (int i = 0; i < n; i++) {
        if (!f[i]) explore(i);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...