Submission #1287043

#TimeUsernameProblemLanguageResultExecution timeMemory
1287043julia_08Making Friends on Joitter is Fun (JOI20_joitter2)C++20
0 / 100
6 ms9792 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){

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

  ans -= sz_a * ((int) s[a].size() + sz_a - 1);
  ans -= sz_b * ((int) 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(get(x) != b) s[b].insert(x);

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

  pai[a] = b;

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

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

  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;

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

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

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

      dsu_union(a, b);

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

      ans += (int) comp[b].size();
      s[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...