제출 #1332291

#제출 시각아이디문제언어결과실행 시간메모리
1332291MisterReaperMeetings (JOI19_meetings)C++20
100 / 100
805 ms1164 KiB
#include "meetings.h"
#include "bits/stdc++.h"

using i64 = long long;

#ifdef DEBUG
    #include "../debug.h"
#else
    #define debug(...) void(23)
#endif

namespace {
    void send(int u, int v) {
        if (u > v) {
            std::swap(u, v);
        }
        debug(u, v);
        Bridge(u, v);
    }

    std::random_device rd;
    std::mt19937 rng(rd());
};

void solve_line(int a, int b, std::vector<int> ids) {
    std::shuffle(ids.begin(), ids.end(), rng);
    debug(0, ids);
    int n = int(ids.size());
    if (n == 0) {
        send(a, b);
        return;
    }
    
    int x = ids[0];
    std::vector<int> rig;
    std::vector<int> lef;
    for (int i = 1; i < n; ++i) {
        int res = Query(a, x, ids[i]);
        if (res == x) {
            rig.emplace_back(ids[i]);
        } else {
            lef.emplace_back(ids[i]);
        }
    }
    solve_line(a, x, lef);
    solve_line(x, b, rig);
}

void solve(std::vector<int> ids) {
    std::shuffle(ids.begin(), ids.end(), rng);
    debug(1, ids);
    int n = int(ids.size());
    if (n <= 1) {
        return;
    } else if (n == 2) {
        send(ids[0], ids[1]);
        return;
    }

    auto get = [&](int x) -> int {
        return int(std::find(ids.begin(), ids.end(), x) - ids.begin());
    };

    std::vector<int> mid;
    std::vector<std::vector<int>> sub(n);
    sub[get(ids[0])].emplace_back(ids[0]);
    sub[get(ids[1])].emplace_back(ids[1]);
    for (int i = 2; i < n; ++i) {
        int x = Query(ids[0], ids[1], ids[i]);
        if (x != ids[0] && x != ids[1]) {
            mid.emplace_back(x);
        } 
        sub[get(x)].emplace_back(ids[i]);
    }

    std::sort(mid.begin(), mid.end());
    mid.erase(std::unique(mid.begin(), mid.end()), mid.end());

    for (int i = 0; i < n; ++i) {
        solve(sub[i]);
    }
    solve_line(ids[0], ids[1], mid);
}

void Solve(int N) {
    std::vector<int> ids(N);
    std::iota(ids.begin(), ids.end(), 0);
    solve(ids);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...