第一眼感觉是树剖裸体,刚想复制模板
发现是修改这个k-subtree
那不可做了啊,我树剖模板都是靠套的…
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=3e5+10;
int n,m,sumn[maxn+10];
vector<int>vec[maxn+10];
vector< pair<int,int> >q[maxn+10];
int lowbit(int x){return x&(-x);
}
void add(int x,int k){for(;x<=3e5;x+=lowbit(x) ) sumn[x]+=k;
}
ll ask(int x){ll ans=0;for(;x;x-=lowbit(x) ) ans+=sumn[x];return ans;
}
ll ans[maxn+10];
void dfs(int u,int deep,int fa)
{for(int i=0;i<q[u].size();i++)//遍历所有关于u的询问{pair<int,int> w=q[u][i]; add(deep,w.second);add(deep+w.first+1,-w.second); //差分的思想 }ans[ u ]=ask( deep );for(int i=0;i<vec[u].size();i++){int v=vec[u][i];if( v==fa ) continue;dfs(v,deep+1,u); }//下面是回溯,这颗子树处理完了,清空这个子树的影响 for(int i=0;i<q[u].size();i++)//遍历所有关于u的询问{pair<int,int> w=q[u][i]; add(deep,-w.second);add(deep+w.first+1,w.second); //差分的思想 }
}
int main()
{cin >> n;for(int i=1,l,r;i<n;i++){scanf("%d%d",&l,&r);vec[l].push_back(r);vec[r].push_back(l);}cin >> m;for(int i=1;i<=m;i++){int v,d,x;scanf("%d%d%d",&v,&d,&x);q[v].push_back( make_pair(d,x) );}dfs(1,1,0);for(int i=1;i<=n;i++)printf("%d ",ans[i]);
}