# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
766799 | onjo0127 | Making Friends on Joitter is Fun (JOI20_joitter2) | C++17 | 7 ms | 14292 KiB |
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 sz(V) ((int)V.size())
using namespace std;
using pii = pair<int, int>;
using ll = long long;
set<pii> E;
int P[100009], B[100009];
set<int> I[100009], O[100009], A[100009];
ll ans;
int root(int x) {
if(P[x] == x) return x;
return P[x] = root(P[x]);
}
ll f(int x) {
return 1LL * sz(A[x]) * (sz(I[x]) - B[x]) + 1LL * sz(A[x]) * (sz(A[x]) - 1);
}
void merg(int u, int v) {
u = root(u); v = root(v);
if(A[u].size() > A[v].size()) swap(u, v);
ans -= f(u) + f(v);
B[v] += B[u];
for(auto& it: A[u]) {
if(O[v].find(it) != O[v].end()) ++B[v];
if(I[v].find(it) != I[v].end()) ++B[v];
A[v].insert(it);
}
for(auto& it: I[u]) {
if(I[v].find(it) != I[v].end() && A[v].find(it) != A[v].end()) --B[v];
else I[v].insert(it);
}
for(auto& it: O[u]) {
O[v].insert(it);
}
ans += f(v);
P[u] = v;
}
int main() {
int N, M; scanf("%d%d", &N, &M);
for(int i=1; i<=N; i++) {
P[i] = i;
A[i] = {i};
}
while(M--) {
int u, v; scanf("%d%d", &u, &v);
E.insert({u, v});
int U = root(u), V = root(v);
if(U != V) {
ans -= f(V);
I[V].insert(u);
O[U].insert(v);
ans += f(V);
if(E.find({v, u}) != E.end()) merg(u, v);
}
printf("%lld\n", ans);
}
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |