제출 #1287062

#제출 시각아이디문제언어결과실행 시간메모리
1287062julia_08Making Friends on Joitter is Fun (JOI20_joitter2)C++20
0 / 100
4 ms9784 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int MAXN = 1e5 + 10;

int pai[MAXN];

set<int> s[MAXN], comp[MAXN];

ll ans = 0;

int get(int v){
  if(v == pai[v]) return v;
  return pai[v] = get(pai[v]);
}

void dsu_union(int a, int b){

  a = get(a);
  b = get(b);

  ll sz_a = (ll) comp[a].size();
  ll sz_b = (ll) comp[b].size();

  ans -= sz_a * ((ll) s[a].size() + sz_a - 1);
  ans -= sz_b * ((ll) s[b].size() + sz_b - 1);

  if(sz_a + (int) s[a].size() > sz_b + (int) s[b].size()) swap(a, b);

  for(auto x : s[a]) if(!comp[b].count(x)) s[b].insert(x);

  for(auto x : comp[a]){
    comp[b].insert(x);
    if(s[b].count(x)) s[b].erase(x);
  }

  sz_b = (ll) comp[b].size();

  ans += sz_b * ((ll) s[b].size() + sz_b - 1);

  pai[a] = b;

  comp[a].clear();
  s[a].clear();

}

int main(){
  cin.tie(0)->sync_with_stdio(0);

  int n, m; cin >> n >> m;

  for(int i=1; i<=n; i++){
    pai[i] = i;
    comp[i] = {i};
  }

  while(m--){

    int a, b; cin >> a >> b;

    if(get(a) == get(b)){
      cout << ans << "\n";
      continue;
    }

    if(s[get(a)].count(b)){

      dsu_union(a, b);

    } else if(!s[get(b)].count(a)){

      ans += (int) comp[get(b)].size();
      s[get(b)].insert(a);

    }

    cout << ans << "\n";

  }

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...