제출 #1287031

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

using ll = long long;

const int MAXN = 1e5 + 10;

int pai[MAXN]; ll sz[MAXN];

set<int> s[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){

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

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

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

  if(s[b].count(a)) s[b].erase(a);

  pai[a] = b;
  sz[b] += sz[a];

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

  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;
    sz[i] = 1;
  }

  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 += sz[b];
      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...