This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define F first
#define S second
using namespace std;
int N, M, dsu[100005], rk[100005];
ll ans;
set<int> fd[100005];
int find(int k)
{
return k == dsu[k] ? k : dsu[k] = find(dsu[k]);
}
void follow(int a, int b)
{
if(fd[a].size() <= fd[b].size())
{
ll ag = fd[a].size(), bg = fd[b].size();
for(auto i : fd[a])
{
if(fd[b].find(i) != fd[b].end())
ag--, bg--;
else fd[b].insert(i);
}
ans += ag * rk[b] + bg * rk[a];
if(rk[a] <= rk[b])
{
dsu[a] = b;
rk[b] += rk[a];
}
else
{
dsu[b] = a;
rk[a] += rk[b];
fd[a].swap(fd[b]);
}
}
else follow(b, a);
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> N >> M;
for(int i = 1; i <= N; i++)
{
dsu[i] = i, rk[i] = 1;
fd[i].insert(i);
}
for(int i = 1; i <= M; i++)
{
int A, B;
cin >> A >> B;
if(find(A) == find(B));
else if(fd[find(B)].find(A) != fd[find(B)].end());
else if(fd[find(A)].find(B) != fd[find(A)].end())
{
//cout << "mergeeee\n";
follow(find(A), find(B));
}
else
{
//cout << "simple follow\n";
fd[find(B)].insert(A);
ans += rk[find(B)];
}
cout << ans << '\n';
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |