Submission #835755

#TimeUsernameProblemLanguageResultExecution timeMemory
835755LoboGame (IOI14_game)C++17
0 / 100
1 ms340 KiB
#include "game.h"
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define fr first
#define sc second

const int maxn = 1510;

int made[maxn][maxn], ds[maxn];
vector<int> dsv[maxn];
map<int,int> ask[maxn];

int find(int v) {
    if(v == ds[v]) return v;
    return ds[v] = find(ds[v]);
}

void join(int u, int v) {
    if(dsv[u].size() < dsv[v].size()) swap(u,v);
    for(auto x : dsv[v]) {
        dsv[u].pb(x);
    }
    ds[v] = u;
    for(auto X : ask[v]) {
        int x = X.fr;
        ask[u][x]+= ask[v][x];
    }
}

void initialize(int n) {
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            made[i][j] = 0;
            if(i != j) {
                ask[i][j] = 1;
                ask[j][i] = 1;
            }
        }
    }
    for(int i = 0; i < n; i++) {
        ds[i] = i;
        dsv[i].pb(i);
    }
}


int hasEdge(int u, int v) {
    made[u][v] = 1;
    made[v][u] = 1;
    ask[u][v]--;
    ask[v][u]--;
    u = find(u);
    v = find(v);
    if(find(u) == find(v)) return 0;
    // assert(u != v);

    bool ok = true;
    for(auto x : dsv[u]) {
        for(auto y : dsv[v]) {
            if(made[x][y] == 0) ok = false;
        }
    }

    if(ask[u][v] != 0) ok = false;

    if(ok) {
        join(u,v);
        return 1;
    }
    else {
        return 0;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...