Submission #581327

#TimeUsernameProblemLanguageResultExecution timeMemory
581327JosiaGame (IOI14_game)C++14
0 / 100
1 ms312 KiB
#include <bits/stdc++.h>
#include "game.h"

using namespace std;

// #define int int64_t


int N;


struct chefNode {
    int chef;
    set<pair<int, int>> connections;
};



vector<chefNode> chefs;

void initUnionfind(int n) {
    chefs.clear();
    chefs.resize(n);
    for (int i = 0; i<n; i++) {
        chefNode x;
        x.chef = i;
        for (int j = 0; j<n; j++) {
            if (i == j) continue;
            x.connections.insert({i, j});
        }
        chefs[i] = x;
    }
}


int find(int x) {
    if (chefs[x].chef == x) return x;
    return chefs[x].chef = find(chefs[x].chef);
}


void unite(int a, int b) {
    a = find(a); b = find(b);
    if (a == b) return;

    chefs[a].chef = b;

    for (auto i: chefs[a].connections)
        chefs[b].connections.insert(i);

    chefs[a].connections.clear();

    set<pair<int, int>> newConnections;

    for (auto i: chefs[b].connections)
        if (find(i.first) != find(i.second)) newConnections.insert(i);

    chefs[b].connections = newConnections;
}



void initialize(int n) {
    N = n;
    initUnionfind(n);
}


int hasEdge(int u, int v) {
    if (find(u) == find(v)) return 0;   // return rand()%2;

    if (chefs[find(u)].connections.size() == 1 || chefs[find(v)].connections.size() == 1) {
        unite(find(u), find(v));
        return 1;
    }


    chefs[find(u)].connections.erase({u, v});
    chefs[find(v)].connections.erase({v, u});
    return 0;
}









// signed main() {
//     int n; cin >> n;
//     initialize(n);
//     for (int i = 0; i<(n*(n-1))/2; i++) {
//         int u, v; cin >> u >> v;
//         cout << hasEdge(u, v) << "\n";
//     }
// }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...