#include <bits/stdc++.h>
#define pb push_back
//#define int long long
using namespace std;
#include "game.h"
int N;
vector<int> par;
struct DSU{
vector<int> arr;
int option;
};
vector<DSU> dsuarr;
vector<vector<int> > edge;
int fnd(int a){
if(a == par[a]) return a;
else return par[a] = fnd(par[a]);
}
void merge(int a, int b){
int olda = a, oldb = b;
a = fnd(a), b = fnd(b);
if(a == b){
//cout<<olda<<" ve "<<oldb<<" nasil ayni q"<<endl;
return;
}
int new_op = dsuarr[a].option + dsuarr[b].option - 2;
par[b] = a;
for(auto itr: dsuarr[b].arr){
dsuarr[a].arr.pb(itr);
}
dsuarr[a].option = new_op;
edge[olda][oldb] = edge[oldb][olda] = 1;
}
void initialize(int n) {
N = n;
edge.resize(n);
for(int i = 0; i < n; i++){
edge[i].resize(n);
edge[i][i] = -1;
}
dsuarr.resize(n);
for(int i = 0; i < n; i++){
dsuarr[i].arr.pb(i);
dsuarr[i].option = n-1;
}
par.resize(n);
for(int i = 0; i < n; i++){
par[i] = i;
}
}
int hasEdge(int u, int v) {
int uset = fnd(u), vset = fnd(v);
if(edge[u][v] != 0){
if(edge[u][v] == -1) return 0;
else return 1;
}
if(dsuarr[uset].option == 1 || dsuarr[vset].option == 1){
merge(u, v);
return 1;
}
dsuarr[uset].option--;
dsuarr[vset].option--;
edge[u][v] = edge[v][u] = -1;
if(dsuarr[uset].option == 1){
int x = 0, y = 0;
for(auto itr: dsuarr[uset].arr){
for(int j = 0; j < N; j++){
if(edge[itr][j] == 0){
x = itr;
y = j;
}
}
}
merge(x, y);
}
uset = fnd(u), vset = fnd(v);
if(dsuarr[vset].option == 1){
int x = 0, y = 0;
for(auto itr: dsuarr[vset].arr){
for(int j = 0; j < N; j++){
if(edge[itr][j] == 0){
x = itr;
y = j;
}
}
}
merge(x, y);
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |