TLE求助
查看原帖
TLE求助
685964
shuqiang楼主2025/6/13 23:24
#include<iostream>
#include<map>
#include<vector>

using namespace std;
typedef long long ll;

const int N = 5e3 + 10, D = 210, base = 5001, mod = 1e9 + 7;
int d, n, m, u, v, k, fa[N][D], ans, a[N], b[D];
map<int, int> mp; vector<int> g[N][D], ers;

int fd(int x, int y){
	if(fa[x][y] == x) return fa[x][y];
	return fa[x][y] = fd(fa[x][y], y);
}

void mg(int u, int v, int k){
	a[u] = ((a[u] - (ll)b[k] * fa[u][k]) % mod + mod) % mod;
	fa[u][k] = v;
	a[u] = ((a[u] + (ll)b[k] * fa[u][k]) % mod + mod) % mod;
}

int main(){
	cin >> d >> n >> m;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= d; j++) fa[i][j] = i;
	}
	b[d] = 1;
	for(int i = d-1; i >= 1; i--){
		b[i] = (ll)b[i+1] * base % mod;
	}
	for(int i = 1; i <= n; i++){
		int hs = 0;
		for(int j = 1; j <= d; j++){
			hs = (hs + (ll)b[j] * i % mod) % mod;
			g[i][j].push_back(i);
		}
		a[i] = hs;
		mp[hs]++;
	}
	while(m--){
		cin >> u >> v >> k;
		u = fd(u, k); v = fd(v, k);
		if(u == v){
			cout << ans << '\n';
			continue;
		}
		ans = 0;
		if(g[u][k].size() > g[v][k].size()) swap(u, v);
		for(int nd: g[u][k]){
			mp[a[nd]]--;
			mg(nd, v, k);
			mp[a[nd]]++;
			g[v][k].push_back(nd);
		}
		g[u][k].clear();
		for(auto i: mp){
			ans += i.second * i.second;
			if(i.second == 0) ers.push_back(i.first);
		}
		for(int i: ers) mp.erase(i);
		ers.clear();
		cout << ans << '\n';
	}
	return 0;
}
2025/6/13 23:24
加载中...