Submission #412815

#TimeUsernameProblemLanguageResultExecution timeMemory
412815pliamGame (IOI14_game)C++14
100 / 100
494 ms25260 KiB
#include "game.h"
#include <bits/stdc++.h>
using namespace std;
#define MAXN 1500

int parent[MAXN],height[MAXN];
int rem[MAXN][MAXN];
int N;

int find_set(int v){
    if(parent[v]==v) return v;
    else return parent[v]=find_set(parent[v]);
}

bool is_connected(int a,int b){
    return find_set(a)==find_set(b);
}

void union_sets(int a,int b){
    a=find_set(a);
    b=find_set(b);
    if(a==b) return;
    if(height[a]<height[b]) swap(a,b);
    parent[b]=a;
    if(height[a]==height[b]) height[a]++;
    for(int i=0;i<N;i++){
        rem[a][i]+=rem[b][i];
        rem[i][a]+=rem[i][b];
    }
}

void initialize(int n) {
    N=n;
    for(int i=0;i<n;i++){
        parent[i]=i;
        height[i]=0;
        for(int j=0;j<n;j++){
            if(i==j) continue;
            rem[i][j]=1;
        }
    }
}

int hasEdge(int u, int v) {
    u=find_set(u);
    v=find_set(v);
    if(u==v){
        return 1;
    }else{
        if(rem[u][v]>1){
            rem[u][v]--;
            rem[v][u]--;
            return 0;
        }else{
            union_sets(u,v);
            return 1;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...