以下为AC代码
#include<bits/stdc++.h>
#define ll long long
#define f(i,a,b,n) for(int i=a;i<=b;i+=n)
#define ff(i,a,b,n) for(int i=a;i>=b;i-=n)
using namespace std;
int n,K,x,y,dp[100005][25],w[100005];
vector<int> tree[100005];
void dfs(int k,int fa){
for(int i=0;i<=K;i++) dp[k][i]+=w[k];
for(int i=0;i<tree[k].size();i++){
int v=tree[k][i];
if(v==fa) continue;
dfs(v,k);
for(int j=1;j<=K;j++) dp[k][j]+=dp[v][j-1];
}
}
void finds(int k,int fa){
for(int i=0;i<tree[k].size();i++){
int v=tree[k][i];
if(v==fa) continue;
for(int j=K;j>=2;j--) dp[v][j]+=dp[k][j-1]-dp[v][j-2];
dp[v][1]+=dp[k][0];
finds(v,k);
}
}
int main(){
cin>>n>>K;
for(int i=1;i<n;i++){
cin>>x>>y;
tree[x].push_back(y);
tree[y].push_back(x);
}
for(int i=1;i<=n;i++) cin>>w[i];
dfs(1,-1);
finds(1,-1);
for(int i=1;i<=n;i++) cout<<dp[i][K]<<endl;
return 0;
}
以下为 90 pts RE on #5 代码
#include<bits/stdc++.h>
#define ll long long
#define f(i,a,b,n) for(int i=a;i<=b;i+=n)
#define ff(i,a,b,n) for(int i=a;i>=b;i-=n)
using namespace std;
int n,K,x,y,dp[100005][25],w[100005];
vector<int> tree[100005];
void dfs(int k,int fa){
f(i,0,K,1) dp[k][i]+=w[k];
f(i,0,tree[k].size()-1,1){
int v=tree[k][i];
if(v==fa) continue;
dfs(v,k);
f(j,1,K,1) dp[k][j]+=dp[v][j-1];
}
}
void finds(int k,int fa){
f(i,0,tree[k].size()-1,1){
int v=tree[k][i];
if(v==fa) continue;
ff(j,K,2,1) dp[v][j]+=dp[k][j-1]-dp[v][j-2];
dp[v][1]+=dp[k][0];
finds(v,k);
}
}
int main(){
scanf("%d%d",&n,&K);
f(i,1,n-1,1){
scanf("%d%d",&x,&y);
tree[x].push_back(y);
tree[y].push_back(x);
}
f(i,1,n,1) scanf("%d",&w[i]);
dfs(1,-1);
finds(1,-1);
f(i,1,n,1) printf("%d\n",dp[i][K]);
return 0;
}
唯二区别在于for循环的宏定义与否以及格式读写和流输入输出的不同
这是为什么,其他题目没有出现过这种问题