语文题。。我一开始以为可以只从一部分子节点获取然后就不会做了。。
看懂题之后发现确定了一个点就确定了一颗树,那我们计算当i点不变时根节点的值,那么这些值的众数就是不变节点的最大数量了。。但是这个数可能很大,所以要hash一下,多取几个数模一下就安全了。。
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 500005
#define ll long long
#define p2 10000007
#define p1 999999999997
using namespace std;
struct edge{
int e,next;
}ed[N];
struct num{
ll x,y;
}b[N];
int n,s,e,i,ne=0,ans,a[N],cnt,size[N],q[N];
void add(int s,int e)
{
ed[++ne].e=e;ed[ne].next=a[s];a[s]=ne;
}
void dfs(int x,ll q1,ll q2)
{
b[x].x=(q1*q[x])%p1;b[x].y=(q2*q[x])%p2;
for (int j=a[x];j;j=ed[j].next)
dfs(ed[j].e,(q1*(ll)size[x])%p1,(q2*(ll)size[x])%p2);
}
bool cmp(num a,num b)
{
if (a.x!=b.x) return a.x<b.x;else return a.y<b.y;
}
int main()
{
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%d",&q[i]),a[i]=size[i]=0;
for (i=1;i<n;i++)
{
scanf("%d%d",&s,&e);
add(s,e);size[s]++;
}
dfs(1,1,1);
sort(b+1,b+1+n,cmp);
b[0].x=b[0].y=-1;cnt=0;ans=n+1;
for (i=1;i<=n;i++)
if (b[i].x==b[i-1].x&&b[i].y==b[i-1].y) cnt++;
else ans=min(ans,n-cnt),cnt=1;
ans=min(ans,n-cnt);
printf("%d\n",ans);
}