思维题 略水
我们一定要用以偏概全的眼光做这道题。。。
一根节点说明一切
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MOD 1000000009
#define D 500010
#define LL long long
#define lp(i,j,k) for(int i = j;i <= k;++i)
int n,a[D],u,v,t,cnt,head[D],mx,no;
LL res[D];
bool vis[D];
struct edge {
int v,next;
}e[D * 2];
void adde (int u,int v) {
e[++cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt;
e[++cnt].v = u;
e[cnt].next = head[v];
head[v] = cnt;
}
void work (int X,LL ti) {
res[X] = ti * a[X];
res[X] %= MOD;
LL T = 0;
for(int i = head[X];i != -1;i = e[i].next)
if(!vis[e[i].v])
++T;
T *= ti;
T %= MOD;
for(int i = head[X];i != -1;i = e[i].next)
if(!vis[e[i].v]) {
vis[e[i].v] = 1;
work(e[i].v,T);
}
}
int main () {
memset(head,-1,sizeof head);
scanf("%d",&n);
lp(i,1,n)
scanf("%d",&a[i]);
lp(i,1,n - 1) {
scanf("%d%d",&u,&v);
adde(u,v);
}
vis[1] = res[1] = a[1];
for(int i = head[1];i != -1;i = e[i].next)
++t;
for(int i = head[1];i != -1;i = e[i].next) {
vis[e[i].v] = 1;
work(e[i].v,t);
}
std::sort(res + 1,res + 1 + n);
lp(i,1,n) {
if(res[i] != res[i - 1]) {
if(no > mx)
mx = no;
no = 1;
}
else ++no;
}
if(no > mx)
mx = no;
printf("%d\n",n - mx);
}