求助,简单树形dp
查看原帖
求助,简单树形dp
311306
dk_qwq楼主2022/10/13 18:52

WA30/kk

#include<iostream>
#include<cstdio>
#include<vector>
#define debug(x) cout<<#x<<':'<<x<<endl
using namespace std;
inline int read(){
	int x=0;short p=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') p=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*p;
}
typedef long long ll;
const int N=1e5+5;
vector<int>e[N];
void add(int u,int v){
	e[u].push_back(v);
	e[v].push_back(u);
}
ll f[N][25];
int fa[N];
int n,k;
int v[N];
void dfs(int u){
	f[u][0]+=v[u];
	for(auto v:e[u]){
		if(v==fa[u]) continue;
		fa[v]=u;
		dfs(v);
		for(int i=1;i<=k;i++) f[u][i]+=f[v][i-1];
	}
}
void solve(int u){
	int cnt=k-1,tot=1;
	ll ans=f[u][k];
	while(fa[u]!=0&&cnt>=0){
		ans+=f[fa[u]][cnt];
		if(cnt-tot>=0) ans-=f[u][cnt-tot];
		u=fa[u];
		cnt--,tot++;
	}
	printf("%lld\n",ans);
}
int main() {
	n=read(),k=read();
	for(int i=1;i<n;i++) add(read(),read());
	for(int i=1;i<=n;i++) v[i]=read();
	dfs(1);
	for(int u=1;u<=n;u++)
		for(int i=1;i<=k;i++) f[u][i]+=f[u][i-1];
	for(int i=1;i<=n;i++) solve(i);
}
2022/10/13 18:52
加载中...