#include "game.h"
#include <bits/stdc++.h>
using namespace std;
struct DSU {
vector<int> rank, parent;
void init(int n) {
rank.assign(n, 1);
parent.resize(n);
for (int i=0; i<n; i++) {
parent[i] = i;
}
}
int find(int n) {
return (n == parent[n] ? n : parent[n] = find(parent[n]));
}
bool sameComponent(int n1, int n2) {
int p1 = find(n1);
int p2 = find(n2);
return p1==p2;
}
void unite(int n1, int n2) {
int p1 = find(n1);
int p2 = find(n2);
if (p1==p2) return;
if (rank[p1] >= rank[p2]) {
rank[p1] += rank[p2];
parent[p2] = p1;
}
else {
rank[p2] += rank[p1];
parent[p1] = p2;
}
}
};
DSU dsu;
int n;
vector<vector<int>> s;
void initialize(int _n) {
n = _n;
s.assign(n, vector<int>(n, 1));
for (int i=0; i<n; i++) {
s[i][i] = 0;
}
dsu.init(n);
}
int hasEdge(int u, int v) {
if (dsu.sameComponent(u, v)) return 0;
int pu = dsu.find(u);
int pv = dsu.find(v);
bool ans = (s[pu][pv] == 1);
if (ans==0) {
s[pu][pv]--;
s[pv][pu]--;
//cout << s[pu][pv] << " " << pu << " " << pv << endl;
}
else {
dsu.unite(u, v);
int w = dsu.find(u);
vector<bool> vis(n);
for (int i=0; i<n; i++) {
int x = dsu.find(i);
if (!vis[x]) {
vis[x] = true;
s[w][x] = s[x][w] = s[pu][x] + s[pv][x];
}
}
}
return ans;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |