제출 #1188949

#제출 시각아이디문제언어결과실행 시간메모리
1188949onbertMeetings (JOI19_meetings)C++20
0 / 100
1 ms576 KiB
#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;

const int maxn = 2005;
int n;
vector<int> adj[maxn];
vector<int> added;
bool exist[maxn];

int sub[maxn], fa[maxn];
void dfs(int u) {
    sub[u] = 1;
    for (int v:adj[u]) if (exist[v] && v != fa[u]) {
        fa[v] = u;
        dfs(v);
        sub[u] += sub[v];
    }
}

int cent, P1, P2, cur = 0;
int mark[maxn];
void dfs2(int u) {
    if (cur == P1) cur += 1;
    else if (cur == P2) cur += 2;
    mark[u] = cur;
    for (int v:adj[u]) if (exist[v] && v != fa[u]) {
        fa[v] = u;
        dfs2(v);
    }
    if (cur == P1) cur -= 1;
    else if (cur == P2) cur -= 2;
}

void solve(int add, vector<int> vec) {
    int sz = vec.size();
    if (sz == 2) {
        int ret = Query(vec[0], vec[1], add);
        if (ret == vec[0] || ret == vec[1]) {
            adj[ret].push_back(add); adj[add].push_back(ret);
        } else {
            for (int &v:adj[vec[0]]) if (v == vec[1]) v = ret;
            for (int &v:adj[vec[1]]) if (v == vec[0]) v = ret;
            adj[ret].push_back(vec[0]); adj[ret].push_back(vec[1]);
            if (ret != add) {
                adj[ret].push_back(add);
                adj[add].push_back(ret);
                added.push_back(ret);
            }
        }
        return;
    } else if (sz == 1) {
        adj[vec[0]].push_back(add); adj[add].push_back(vec[0]);
        return;
    }

    int RT = vec[0];
    fa[RT] = -1;
    dfs(RT);
    for (int u:vec) {
        vector<pair<int,int>> child;
        if (u != RT) child.push_back({sz - sub[u], fa[u]});
        for (int v:adj[u]) child.push_back({sub[v], v});
        sort(child.rbegin(), child.rend());
        if (child[0].first <= sz/2) {
            cent = u;
            P1 = child[0].second, P2 = child[1].second;
        }
    }
    dfs(cent);
    int ret = Query(add, P1, P2);
    if (ret == P1) ret = 1;
    else if (ret == P2) ret = 2;
    else ret = 0;
    vector<int> nxt;
    for (int i:vec) {
        if (mark[i] == ret) nxt.push_back(i);
        else exist[i] = false;
    }
    if (ret == 0) {
        nxt.push_back(P1); nxt.push_back(P2);
        exist[P1] = exist[P2] = true;
    }
    solve(add, nxt);
}

void Solve(int N) {
    n = N;
    adj[0].push_back(1), adj[1].push_back(0);
    added = {0, 1};
    for (int i=2;i<n;i++) {
        for (int j:added) exist[j] = true;
        solve(i, added);
    }

    set<pair<int,int>> ans;
    for (int i=0;i<n;i++) {
        for (int v:adj[i]) if (i < v) ans.insert({i, v});
    }
    for (auto [u, v]:ans) Bridge(u, 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...