TLE on test 15 求助
查看原帖
TLE on test 15 求助
324219
hunction楼主2024/4/26 17:25

有哪位巨佬知道为什么会 T 啊啊啊

断断续续做了两天了

#include <bits/stdc++.h>
using lld = long long;
const int N = 5e5 + 5;
int n, m, K, C[N], F[N], dep[N], ptr[N], dis[N], pstk;
bool flg[N];
std::vector<int> to[N], col[N];
int Find(int x, int &d) {
	if (x == F[x]) return x;
	d += dis[x];
	return Find(F[x], d);
}
struct Undo {
	int u, v, f, ds, dp;
	void undo() {
		F[u] = f;
		dis[u] = ds;
		dep[v] = dp;
	}
} stk[N];
bool Link(int u, int v) {
	int du = 0, dv = 0;
	u = Find(u, du), v = Find(v, dv);
	if (dep[u] > dep[v]) std::swap(u, v), std::swap(du, dv);
	if (u == v) return !(du ^ dv ^ 1);
	stk[++pstk] = { u, v, F[u], dis[u], dep[v] };
	F[u] = v;
	dis[u] = 1 ^ du ^ dv;
	dep[v] += dep[u] == dep[v];
	return true;
}
int main() {
	scanf("%d%d%d", &n, &m, &K);
	for (int i = 1; i <= n; i++) scanf("%d", &C[i]), col[C[i]].push_back(i), F[i] = i, dep[i] = 1;
	for (int i = 1, u, v; i <= m; i++) {
		scanf("%d%d", &u, &v);
		if (C[u] == C[v]) {
			if (!flg[C[u]]) flg[C[u]] |= !Link(u, v);
		} else {
			to[u].push_back(v);
			to[v].push_back(u);
		}
	}
	for (int u = 1; u <= n; u++)
		std::sort(to[u].begin(), to[u].end(), [](int x, int y) { return C[x] < C[y]; });
	lld ans = 1ll * K * (K - 1);
	for (int i = 1; i <= K; i++) {
		std::vector<int> SC;
		for (int u : col[i]) {
			// assert(ptr[u] == 0);
			for (int v : to[u]) SC.push_back(C[v]);
		}
		std::sort(SC.begin(), SC.end());
		SC.erase(std::unique(SC.begin(), SC.end()), SC.end());
		assert(SC.size() < K);
		if (flg[i]) {
			ans -= SC.size();
			continue;
		}
		for (int c : SC) {
			int sz = pstk, f = 0;
			for (int u : col[i])
				for (; ptr[u] < to[u].size(); ptr[u]++) {
					int v = to[u][ptr[u]];
					if (C[v] != c) break;
					if (!f) f |= !Link(u, v);
				}
			ans -= f;
			while (pstk > sz) stk[pstk--].undo();
		}
	}
	printf("%lld\n", ans / 2);
	return 0;
}
2024/4/26 17:25
加载中...