Submission #1171196

#TimeUsernameProblemLanguageResultExecution timeMemory
1171196jerzykMeetings (JOI19_meetings)C++20
0 / 100
1184 ms748 KiB
#include <bits/stdc++.h>
#include "meetings.h"

using namespace std;
#define pb push_back
#define st first
#define nd second
typedef long long ll;
typedef long double ld;
const ll I = 1000'000'000'000'000'000LL;
const int II = 2'000'000'000;
const ll M = 1000'000'007LL;
const int N = 2'007;
bool vis[N];
int siz[N];
vector<int> ed[N];
int cen;

bool Cp(int a, int b)
{
    return (siz[a] > siz[b]);
}

void DFS(int v, int il)
{
    vis[v] = 1; siz[v] = 1;
    bool czy = 1;
    for(int i = 0; i < (int)ed[v].size(); ++i)
    {
        if(vis[ed[v][i]]) continue;
        DFS(ed[v][i], il);
        if(siz[ed[v][i]] > il / 2) czy = 0;

        siz[v] += siz[ed[v][i]];
    }
    if(il - siz[v] > il / 2) czy = 0;
    if(czy) cen = v;
    vis[v] = 0;
}

void Insert(int a, int b, int c)
{
    erase(ed[a], b); erase(ed[b], a);
    ed[a].pb(c); ed[b].pb(c);
    ed[c].pb(a); ed[c].pb(b);
}

void Ins(int nw, int n)
{
    int il = n, s = 1;
    for(int i = 0; i < n; ++i) vis[i] = 0;
    while(true)
    {
        DFS(s, il);
        s = -1;
        int v = cen;
        vector<int> akt;
        for(int i = 0; i < (int)ed[v].size(); ++i)
            if(!vis[ed[v][i]]) akt.pb(ed[v][i]);
        sort(akt.begin(), akt.end(), Cp);
        vis[v] = 1;
        for(int i = 0; i < (int)akt.size(); ++i)
        {
            int a = Query(v, akt[i], nw);
            if(a == nw)
            {
                Insert(v, akt[i], nw);
                return;
            }
            if(a == akt[i])
            {
                il = siz[akt[i]];
                s = akt[i];
                break;
            }
        }
        if(s == -1)
        {
            ed[v].pb(nw);
            ed[nw].pb(v);
            return;
        }
    }
}

void Solve(int _N)
{
    int n = _N;
    if(n == 1) return;
    ed[0].pb(1); ed[1].pb(0);
    for(int i = 2; i < n; ++i)
        Ins(i, i);
    for(int i = 0; i < n; ++i)
        for(int j = 0; j < (int)ed[i].size(); ++j)
            if(ed[i][j] > i)
                Bridge(i, ed[i][j]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...