RT,好不容易想出来一个E但却被卡常了/fn,能省常数基本都省了,重心也没什么问题,但死活过不去。
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int kMaxN = 2e5 + 5;
int vis[kMaxN], f[kMaxN], s[kMaxN], a[kMaxN], l[kMaxN], p, sz, rt, n, m, t;
int v[kMaxN], d[kMaxN], cnt[kMaxN];
LL ans;
vector<int> g[kMaxN];
void F(int u, int fa) { // 找重心
if (vis[u]) {
return;
}
s[u] = 1, f[u] = 0;
for (int i : g[u]) {
if (i != fa) {
F(i, u);
s[u] += s[i];
f[u] = max(f[u], s[i]);
}
}
f[u] = max(f[u], sz - s[u]);
(f[u] < f[rt]) && (rt = u);
}
void D(int u, int fa, int op) {
d[++p] = u, l[p] = !v[a[u]], ans += cnt[a[u]] * (!v[a[u]]) * op;
v[a[u]]++;
for (int i : g[u]) {
if (!vis[i] && i != fa) {
D(i, u, op);
}
}
v[a[u]]--;
}
void A(int u) {
cnt[a[u]]++;
for (register int id = 0; id < g[u].size(); id++) {
int i = g[u][id];
if (!vis[i]) {
D(i, u, 1);
for (register int j = 1; j <= p; j++) {
int id = d[j];
cnt[a[id]] += l[j] && a[id] != a[u];
}
p = 0;
}
}
for (register int id = 0; id < g[u].size(); id++) {
int i = g[u][id];
if (!vis[i]) {
D(i, u, 0);
for (register int j = 1; j <= p; j++) {
int id = d[j];
cnt[a[id]] -= l[j] && a[id] != a[u];
}
p = 0;
}
}
cnt[a[u]]--;
}
void S(int u) {
vis[u] = 1;
A(u);
for (register int id = 0; id < g[u].size(); id++) {
int i = g[u][id];
if (!vis[i]) {
rt = 0, sz = s[i], F(i, u);
S(rt);
}
}
}
void C() {
f[0] = 1e9;
cin >> n;
for (register int i = 1; i <= n; i++) {
cin >> a[i];
}
for (register int i = 1, u, v; i < n; i++) {
cin >> u >> v;
g[u].push_back(v), g[v].push_back(u);
}
rt = 0, sz = n, F(1, 0);
S(rt);
cout << ans << "\n";
ans = 0;
for (register int i = 1; i <= n; i++) {
g[i].clear();
vis[i] = f[i] = s[i] = 0;
}
p = sz = rt = 0;
}
int main() {
ios ::sync_with_stdio(0), cin.tie(0), cout.tie(0);
for (cin >> t; t; t--) {
C();
}
return 0;
}