题意:
给定n个点的树,点1为根,每个点一开始的权值为1,
q次操作,每次操作给定(x,val),将以点x为根的所有点的权值加上val,
所有操作结束之后输出所有点的权值。
数据范围:n,q<=2e5
解法:
用dfs序将子树问题转化为序列问题,
因为只需要最后输出答案,那么在序列上做差分即可。
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=2e5+5;
vector<int>g[maxm];
int L[maxm],R[maxm],idx;
int a[maxm];
int n,q;
void dfs(int x,int fa){
L[x]=++idx;
for(int v:g[x]){
if(v==fa)continue;
dfs(v,x);
}
R[x]=idx;
}
signed main(){
cin>>n>>q;
for(int i=1;i<n;i++){
int a,b;cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
dfs(1,1);
while(q--){
int x,val;cin>>x>>val;
a[L[x]]+=val;
a[R[x]+1]-=val;
}
for(int i=1;i<=n;i++){
a[i]+=a[i-1];
}
for(int i=1;i<=n;i++){
cout<<a[L[i]]<<' ';
}
return 0;
}