# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
766868 | onjo0127 | Making Friends on Joitter is Fun (JOI20_joitter2) | C++17 | 9 ms | 19104 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define sz(V) ((int)V.size())
using namespace std;
using pii = pair<int, int>;
using ll = long long;
int P[100009];
set<int> I[100009], A[100009], II[100009], OO[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]) + sz(A[x]) - 1);
}
void merg(int u, int v) {
if(sz(A[u]) + sz(I[u]) + sz(II[u]) + sz(OO[u]) > sz(A[v]) + sz(I[v]) + sz(II[v]) + sz(OO[v])) swap(u, v);
ans -= f(u) + f(v);
for(auto& it: A[u]) if(I[v].find(it) != I[v].end()) I[v].erase(it);
for(auto& it: I[u]) if(A[v].find(it) == A[v].end()) I[v].insert(it);
for(auto& it: A[u]) A[v].insert(it);
for(auto& it: II[u]) if(it != u && it != v) {
OO[it].erase(u);
OO[it].insert(v);
II[v].insert(it);
}
for(auto& it: OO[u]) if(it != u && it != v) {
II[it].erase(u);
II[it].insert(v);
OO[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);
int U = root(u), V = root(v);
if(U != V) {
ans -= f(V);
I[V].insert(u);
II[V].insert(U);
OO[U].insert(V);
ans += f(V);
if(II[U].find(V) != II[U].end()) merg(U, V);
}
printf("%lld\n", ans);
}
return 0;
}
컴파일 시 표준 에러 (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... |