Description
给出一棵以1为根的树,有N个点,每个点上有一个计数器,初始0
接下来Q次操作,每次操作将p_i的子树中所有点的计数器增加x_i,输出最后每个点的计数器值
Format
Input
第一行给出N,Q
接下来N-1行描述这个树
再接下来Q行,每行给出Pi,Xi
2<=N<=2e5
1<=Q<=2e5
xi<=1e4
Output
如题
Samples
输入数据 1
4 3
1 2
2 3
2 4
2 10
1 100
3 1
输出数据 1
100 110 111 110
思路:
每次操作是给以x为根的子树统一加一个数值
于是将增加的数值打在x这个点上,并在今后的dfs遍历中传递下去加给x的每个子结点,一直这样递归下去,直到叶子结点为止
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q,p,x,a[200001],c,d;
vector<int> ljb[200001];
void dfs(int s,int d)
{
a[s] += a[d];
for(int i = 0;i < ljb[s].size();i++)
if(ljb[s][i] != d)
dfs(ljb[s][i],s);
}
signed main()
{
cin>>n>>q;
for(int i = 1;i < n;i++)
{
cin>>c>>d;
ljb[c].push_back(d);
ljb[d].push_back(c);
}
for(int i = 1;i <= q;i++)
{
cin>>p>>x;
a[p] += x;
}
dfs(1,0);
for(int i = 1;i <= n;i++) cout<<a[i]<<" ";
return 0;
}