Submission #1172971

#TimeUsernameProblemLanguageResultExecution timeMemory
1172971patgraMeetings (JOI19_meetings)C++20
100 / 100
701 ms1048 KiB
#include <bits/stdc++.h>

#define rep(a,b,c) for(auto a = (b); a != (c); a++)
#define repD(a,b,c) for(auto a = (b); a != (c); a--)
#define repIn(a, b) for(auto a : (b))
#define repIn2(a, b, c) for(auto [a, b] : (c))

constexpr bool dbg = 0;
#define DEBUG if constexpr(dbg)
#define DC DEBUG std::cerr
#define eol std::endl

#define ll long long
#define pb push_back

using namespace std;

#include "meetings.h"

mt19937 rnd(2137);

void myBridge(int v, int u) {
    DC << "  @@@  Bridge " << v << ' ' << u << eol;
    if(u > v) swap(u, v);
    Bridge(u, v);
}

void sortPath(int S, int E, vector<int> V) {
    DC << " Sorting path: " << S << " ( ";
    repIn(i, V) DC << i << ' ';
    DC << ") " << E << eol;
    if(V.empty()) {
        myBridge(S, E);
        return;
    }
    auto mid = V[rnd() % V.size()];
    vector<int> L, R;
    repIn(i, V) if(i != mid) (Query(S, i, mid) == i ? L : R).pb(i);
    sortPath(S, mid, L);
    sortPath(mid, E, R);
}

void DQ(vector<int> V) {
    DC << "DQ: ";
    repIn(i, V) DC << i << ' ';
    DC << eol;
    if(V.size() == 2) myBridge(V[0], V[1]);
    if(V.size() <= 2) return;
    int S = rnd() % V.size(), E = rnd() % (V.size() - 1);
    if(E >= S) E++;
    S = V[S], E = V[E];
    unordered_map<int, vector<int>> subtree;
    vector<int> path;
    subtree[S].pb(S);
    subtree[E].pb(E);
    repIn(i, V) if(i != S && i != E) {
        auto qa = Query(S, E, i);
        if(qa == i) path.pb(i);
        subtree[qa].pb(i);
    }
    sortPath(S, E, path);
    repIn2(pathGuy, st, subtree) DQ(st);
}

void Solve(int N) {
    vector<int> V;
    rep(i, 0, N) V.pb(i);
    DQ(V);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...