# | TimeUTC-0 | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1165092 | boclobanchat | Game (IOI14_game) | C++20 | 0 ms | 0 KiB |
#include"game.h"
#include<bits/stdc++.h>
using namespace std;
int N;
int dsu[1666],F[1666][1666],cnt[1666];
int root(int i)
{
if(!dsu[i]) return i;
return dsu[i]=root(dsu[i]);
}
void merge(int i,int j)
{
if((i=root(i))==(j=root(j))) return ;
dsu[j]=i,cnt[i]+=cnt[j],F[min(i,j)]][max(i,j)]=0;
for(int a=1;a<=N;a++) F[min(a,i)][max(a,i)]+=F[min(a,j)][max(a,j)],F[min(a,j)][max(a,j)]=0;
}
void initialize(int n)
{
N=n;
for(int i=1;i<=n;i++) cnt[i]=1;
return ;
}
int hasEdge(int u,int v)
{
u=root(++u),v=root(++v);
if(u>v) swap(u,v);
if(++F[u][v]==cnt[u]*cnt[v])
{
merge(u,v);
return 1;