제출 #961149

#제출 시각아이디문제언어결과실행 시간메모리
961149Nahian9696게임 (IOI14_game)C++17
100 / 100
288 ms31648 KiB
#include "game.h"
#include <algorithm>


int n, num_comps;

int par[2000];

int comp_size[2000];
int comp_edges[2000][2000];

int find(int u) {
    if (par[u] == u) {
        return u;
    }
    return par[u] = find(par[u]);
}

void initialize(int nn) {
    n = nn;
    for (int i = 0; i < n; i++) {
        par[i] = i;
        comp_size[i] = 1;
        for(int j = 0; j < n; j++) {
            comp_edges[i][j] = 0;
        }
    }
    num_comps = n;
}

int hasEdge(int u, int v) {

    // if (find(u) == find(v)) {
    //     return 1;
    // }


    u = find(u);
    v = find(v);

    if(comp_edges[u][v] + 1 == comp_size[u] * comp_size[v]) {
        comp_edges[u][v] = 0;
        comp_edges[v][u] = 0;

        for(int i = 0; i < n; i++) {
            comp_edges[u][i] += comp_edges[v][i];
            comp_edges[v][i] = 0;
            comp_edges[i][u] += comp_edges[i][v];
            comp_edges[i][v] = 0;
        }

        comp_size[u] += comp_size[v];

        comp_size[v] = 0;

        par[v] = u;

        return 1;
    } else {
        comp_edges[u][v]++;
        comp_edges[v][u]++;
        return 0;
    }


    // if(num_comps > 2) {
    //     if(find(u) < find(v)) {
    //         std::swap(u, v);
    //     }
    //     par[find(u)] = find(v);
    //     num_comps--;
    //     return 1;
    // } else {
    //     return 0;
    // }


    return 1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...