求助,样例没过
查看原帖
求助,样例没过
530349
天空即为极限楼主2023/1/30 15:04
#include <bits/stdc++.h>
using namespace std;
int d, n, m, h[1000005], fa[100005], f[100005], siz[100005], s[1000005]; 

unordered_map <int, int> mp;

vector <int> g[1000005]; //记录每个连通块的节点

int id (int i, int x) { return (i - 1) * n + x; }

int find (int x) { return fa[x] == x ? x : fa[x] = find (fa[x]); }

mt19937 rnd (114514);

int ans = 0;

void calc (int x, int delta) {
  ans -= mp[x] * mp[x];
  mp[x] += delta;
  ans += mp[x] * mp[x];
}

void merge (int a, int b) {
  a = find (a), b = find (b);
  if (a == b) return ;
  if (siz[a] > siz[b]) swap (a, b);
  for (auto i : g[a]) {
    g[b].emplace_back (i);
    int v = i % n + 1;
    calc (s[v], -1); 
    s[v] = s[v] - h[a] + h[b];
    //cout << a << " and " << b << " " << s[v] << "\n";
    calc (s[v], 1);
  }
  fa[a] = b; siz[b] += siz[a];
}

int main () {
  cin >> d >> n >> m;
  for (int j = 1; j <= n; j ++) {
    for (int i = 1; i <= d; i ++) {
      h[id (i, j)] = rnd (), s[j] += h[id (i, j)];
      g[id (i, j)].emplace_back (id (i, j));
      fa[id (i, j)] = id (i, j); siz[id (i, j)] = 1; 
    }
    calc (s[j], 1);
  }
  while (m --) {
    int a, b, k; cin >> a >> b >> k;
    merge (id (k, a), id (k, b));
    cout << ans << "\n";
  }
}
/*
3 4 10
1 2 1
2 1 2
1 2 3
3 4 1
1 3 2
2 3 3
2 4 2
3 4 3
3 4 2
1 3 1
*/
2023/1/30 15:04
加载中...