样例过0pts求调
查看原帖
样例过0pts求调
700558
williamwei楼主2024/8/24 21:52
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
typedef long long ll;
const int maxn = 5000 + 10;
const int maxm = 200 + 10;
const int P = 1222827239;
int n, m, k, ans, val[maxm], h[maxn], fa[maxm][maxn];
vector<int> e[maxm][maxn];
unordered_map<int, int> cnt;
void add(int x) {ans += cnt[x]++ << 1 | 1;}
void del(int x) {
	ans -= --cnt[x] << 1 | 1;
	if (!cnt[x]) cnt.erase(x);
}
int main() {
	ios::sync_with_stdio(false);
	cin >> k >> n >> m; srand(20101008);
	for (int i = 1; i <= k; i++) val[i] = rand();
	for (int i = 1; i <= k; i++)
		for (int u = 1; u <= n; u++)
			fa[i][u] = u, h[u] = (h[u] + (ll)u * val[i]) % P, e[i][u].push_back(u);
	for (int i = 1; i <= n; i++) add(h[i]);
	while (m--) {
		int u, v, k; cin >> u >> v >> k;
		u = fa[k][u]; v = fa[k][v];
		if (u == v) { cout << ans << '\n'; continue; }
		if (e[k][v].size() > e[k][u].size()) swap(u, v);
		for (int x : e[k][v]) {
			e[k][u].push_back(x); fa[k][x] = u;
			del(h[x]); h[x] = (h[x] + (ll)(u - v) * val[k]) % P; add(h[x]);
		} e[k][v].clear();
		cout << ans << '\n';
	}
	return 0;
}
2024/8/24 21:52
加载中...