题意:给一棵树,每次给u到v的路径上所有点加上一个值,最后输出每个点的权值(初始为0)
解法:每次在u,v间加k时,只要让u,v点的权值加上k,u,v的LCA处减去k(因为LCA的子树中加了两个k),再在LCA的父亲(如果有的话)减k,免除对上面的影响。最后dfs一遍,ans[u] += ans[v] (v是u的所有儿子)即可。
这里LCA用RMQ求的。
代码:
#include#include #include #include #include #include #include using namespace std;#define N 100107int fa[N],ans[N];vector G[N];int ati[N],f[N],bn,b[N],dp[N][32],ind;void dfs(int u,int fa) { for(int i=0;i ati[b]) swap(a,b); return f[RMQ(ati[a],ati[b])];}int main(){ int t,cs = 1,i,n,m,u,v,k; scanf("%d",&t); while(t--) { init(); memset(G,0,sizeof(G)); memset(ans,0,sizeof(ans)); scanf("%d",&n); for(i=0;i