Submission #813711

#TimeUsernameProblemLanguageResultExecution timeMemory
813711PikachuGame (IOI14_game)C++17
42 / 100
1080 ms1492 KiB
#include <bits/stdc++.h>
#include "game.h"

using namespace std;

const int maxn = 1510, maxm = maxn * (maxn - 1) / 2;
int n, m;
pair<int,int> edge[maxm];
bool remain[maxm];

int par[maxn];

int findpar(int x)
{
    return par[x] != -1 ? par[x] = findpar(par[x]) : x;
}

bool unite(int u, int v)
{
    u = findpar(u);
    v = findpar(v);
    if (u != v) return par[u] = v, true;
    return false;
}

bool check()
{
    memset(par, -1, sizeof par);
    int cnt = 0;
    for (int i = 0; i < m; i++) {
        if (remain[i]) cnt += unite(edge[i].first, edge[i].second);
    }
    return cnt == n - 1;
}

void initialize(int n) 
{
    ::n = n;
    m = n * (n - 1) / 2;
    int cnt = 0;
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            edge[cnt++] = {i, j};
        }
    }
    for (int i = 0; i < m; i++) remain[i] = true;
}

int cnt = 0;

int hasEdge(int u, int v) 
{
    if (u > v) swap(u, v);
    int id = lower_bound(edge, edge + m, make_pair(u, v)) - edge;
    remain[id] = false;
    if (check()) return 0;
    remain[id] = true;
    return 1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...