제출 #1207340

#제출 시각아이디문제언어결과실행 시간메모리
1207340agusstGame (IOI14_game)C++20
0 / 100
0 ms328 KiB
#include "game.h"
#include <bits/stdc++.h>

#define dbg(x) cerr << #x << ": " << x << "\n";
using namespace std;
int n;
set<int> x;
vector<int> arr, siz, activado;
map<int, int> single, grupal;
void join(int a, int b){
    int u = arr[b];
    for(int i = 0; i < n; i++){
        if(arr[i] == u){
            siz[a]++;
            arr[i] = arr[a];
        }
    }

}
void initialize(int N) {
    n = N;
    arr.assign(n, 0);
    iota(arr.begin(), arr.end(), 0);
    activado.assign(n, 0);
    siz.assign(n, 1);
}

int hasEdge(int u, int v) {
    if(!activado[u] and !activado[v]){
        activado[u] = 1;
        activado[v] = 1;
        int couenta = 0;
        for(int i = 0; i < n; i++){
            if(!activado[i]){
                couenta++;
            } 
        }
        if(single.count(v)){
            single[u] += single[v];
        }
        single[u] += 2 * couenta;
        join(u, v);
        x.insert(u);
        return 1;
    } 
    if(activado[u] and !activado[v]) swap(u, v);
    u = arr[u];
    v = arr[v];
    if(!single.count(u)){
        for(const int &i : x){
            single[u] += siz[i];
        }
    }
    single[u]--;
    single[v]--;
    if(!single[u]){
        activado[u] = 1;
        join(v, u);
        for(int i = 0; i < n; i++){
            if(!activado[i] and single.count(i)){
                single[i]++;
            }
        }
        return 1;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...