RT,试了两种写法一直15分,求调
#include<bits/stdc++.h>
#define il inline
#define re register
#define ll long long
#define ull unsigned ll
#define uint unsigned int
#define umap unordered_map
#define uset unordered_set
#define mset multiset
#define IT iterator
#define pr pair
#define pq priority_queue
#define mpr make_pair
#define int ll
#define tp tuple
#define mtp make_tuple
const int N = 1e6 + 5, inf = 0x3f3f3f3f;
const double pi = acos(-1);
il int R () {
int s = 0, f = 1; char ch = getchar();
while (!isdigit(ch)) f = (ch == '-') ? -1 : 1, ch = getchar();
while (isdigit(ch)) s = (s << 3) + (s << 1) + (ch ^ 48), ch = getchar();
return s * f;
}
int n, tot, ans = inf, maxdep;
int head[N], nxt[N], to[N], a[N], child[N], dep[N], cnt[N], fa[N];
il void add_edge (int u, int v) {
nxt[++tot] = head[u], to[tot] = v, head[u] = tot;
return ;
}
il void dfs (int u, int fath) {
fa[u] = fath, dep[u] = dep[fath] + 1, child[fath]++, cnt[dep[u]]++;
for (int i = head[u]; i; i = nxt[i]) {
int v = to[i];
if (v == fath) continue;
dfs(v, u);
}
return ;
}
int mod[4] = {0, 19260817, 1000000007, 998244353};
struct node {
int val[4];
}f[N];
std :: map <std :: tp <int, int, int>, int> vis;
il void dfs2 (int u, int mul1, int mul2, int mul3) {
f[u].val[1] = a[u] * mul1 % mod[1] * child[fa[u]] % mod[1];
f[u].val[2] = a[u] * mul2 % mod[2] * child[fa[u]] % mod[2];
f[u].val[3] = a[u] * mul3 % mod[3] * child[fa[u]] % mod[3];
std :: tp <int, int, int> tmp = std :: mtp(f[u].val[1], f[u].val[2], f[u].val[3]);
vis[tmp]++;
ans = std :: min(ans, n - vis[tmp]);
for (int i = head[u]; i; i = nxt[i]) {
int v = to[i];
if (v == fa[u]) continue;
dfs2(v, mul1 * cnt[dep[u]] % mod[1], mul2 * cnt[dep[u]] % mod[2], mul3 * cnt[dep[u]] % mod[3]);
}
return ;
}
signed main () {
n = R();
for (int i = 1; i <= n; i++) a[i] = R();
for (int i = 1; i < n; i++) {
int u = R(), v = R();
add_edge(u, v), add_edge(v, u);
}
dfs(1, 0), dfs2(1, 1, 1, 1);
return !printf("%lld", ans);
}