才30分?
查看原帖
才30分?
285856
chen_yy楼主2020/11/2 10:58

换根法

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct node{
	int u,v;
};
int n,k,res,b[N],c[N],dp[N];
int size[N][21],f[N],fa[N],s[N];
vector<int> p[N];
void add(int u,int v)
{
	p[u].push_back(v);
}
void dfs1(int u,int fath)
{
	int i,v;
	for(i=0;i<p[u].size();i++)
	{
		v=p[u][i];
		if(v==fath) continue;
		dfs1(v,u);
		fa[v]=u;
	}
}
void dfs2(int u,int y)
{
	int i,v;
	size[res][y]+=s[u];
	if(y==k+1) {
		return ;
	}
	for(i=0;i<p[u].size();i++)
	{
		v=p[u][i];
		if(v==fa[u]) continue;
		dfs2(v,y+1);
	}
}
void dfs3(int u)
{
	int i,v;
	f[u]=s[u];
	for(i=0;i<p[u].size();i++)
	{
		v=p[u][i];
		if(v==fa[u]) continue;
		dfs3(v);
		f[u]+=(f[v]-size[v][k]);
	}
}
void dfs4(int u)
{
	int i,v;
	int a;
	a=f[u];
	for(i=0;i<=k;i++){
		b[i]=size[u][i];
		c[i]=size[fa[u]][i];
	}
	if(u>1){
		f[u]=f[u]+(f[fa[u]]-(f[u]-size[u][k])-(size[fa[u]][k]-size[u][k-1]));
		dp[u]=f[u];
		for(i=1;i<=k;i++)
			size[fa[u]][i]-=b[i-1];
		size[u][1]+=c[0];
		for(i=2;i<=k;i++)
			size[u][i]+=c[i-1]-b[i-2];
	}
	for(i=0;i<p[u].size();i++){
		v=p[u][i];
		if(v==fa[u]) continue;
		dfs4(v);
	}
	f[u]=a;
	for(i=0;i<=k;i++){
		size[u][i]=b[i];
		size[fa[u]][i]=c[i];
	}
}
int main()
{
	int i;
	int u,v;
	cin>>n>>k;
	for(i=1;i<n;i++)
	{
		cin>>u>>v;
		add(u,v);
		add(v,u);
	}
	for(i=1;i<=n;i++)
	cin>>s[i];
	dfs1(1,0);
	for(i=1;i<=n;i++)
	{
		res=i;
		dfs2(i,0);
	}
	dfs3(1);
	dfs4(1);
	dp[1]=f[1];
	for(i=1;i<=n;i++)
	cout<<dp[i]<<endl;
 	return 0;
}

2020/11/2 10:58
加载中...