[BZOJ3573]HNOI2017米特运输|贪心

    语文题。。我一开始以为可以只从一部分子节点获取然后就不会做了。。

    看懂题之后发现确定了一个点就确定了一颗树,那我们计算当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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值