有哪位巨佬知道为什么会 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;
}