调了好久了,看不出问题,会输出负数,来求助万能的谷民
查看原帖
调了好久了,看不出问题,会输出负数,来求助万能的谷民
135425
Qzong楼主2021/3/25 22:44
#include<bits/stdc++.h>
using namespace std;
const int N=300030;
int head[N],net[N<<1],to[N<<1],tot;
int f[N][21];
int aa[N];
int dh[N];
int bb[N];
int n;
inline void add(int u,int v)
{
	to[++tot]=v;
	net[tot]=head[u];
	head[u]=tot;
}
void go(int u,int fa)
{
//	printf("%d %d\n",u,fa);
	f[u][0]=fa;
	dh[u]=dh[fa]+1; 
	for(int i=head[u];i;i=net[i])
	{
		int v=to[i];
//		printf("%d %d\n",u,to[i]);
		if(v==fa)continue;
		go(v,u);
	}
}
int lca(int u,int v)
{
	if(dh[u]<dh[v])swap(u,v);
	for(int i=20;i>=0;i--)
	if(dh[f[u][i]]>=dh[v])u=f[u][i];
	if(u==v)return u;
//	printf("%d %d\n",u,v);
	for(int i=20;i>=0;i--)
	if(f[u][i]!=f[v][i])u=f[u][i],v=f[v][i];
	return f[u][0];
}
void dfs(int u,int fa)
{
	for(int i=head[u];i;i=net[i])
	{
		int v=to[i];
		if(v==fa)continue;
		dfs(v,u);
		bb[u]+=bb[v];
//		if(bb[v]<0)
//		printf("%d %d %d %dsdfsdfsdfsdf\n",bb[v],u,v,bb[u]);
		
	}
}
int main()
{
//	freopen("a.txt","r",stdin); 
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&aa[i]);
	for(int i=1;i<n;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	go(1,0);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=20;j++)
			f[i][j]=f[f[i][j-1]][j-1];
//	int q;
//	cin>>q;
//	while(q--)
//	{
//		int u,v;
//		cin>>u>>v;
//		cout<<lca(u,v)<<endl; 
//	 } 
	for(int i=1;i<=n-1;i++)
	{
		bb[aa[i]]++;
		bb[aa[i+1]]++;
		int t=lca(aa[i],aa[i+1]);
//		printf("%d %d %d\n",t,aa[i],aa[i+1]);
		bb[t]--;
		bb[f[t][0]]--;
	}
	dfs(1,0);
	for(int i=2;i<=n;i++)bb[aa[i]]--;
	for(int i=1;i<=n;i++)
	{
		printf("%d\n",bb[i]);
	}
	return 0;
} 
2021/3/25 22:44
加载中...