链接:https://www.luogu.org/problemnew/show/P3676
题解:
看暴力:每次修改只会影响到它到1的链,询问也是它到1的链
那么考虑用树链剖分变成dfs序
链剖都想了那就考虑用线段树维护这个dfs序上的信息
维护dfs序上每个点子树的val和的平方和
修改?
假设修改uu的变化量为dd
那么该完后uu的祖先们ii的子树平方和变成
∑j∈i的子树(sum[j]+d)2=∑(sum2[j]+2∗d∗sum[j]+d2)∑j∈i的子树(sum[j]+d)2=∑(sum2[j]+2∗d∗sum[j]+d2)
设有子树大小为numnum,就是∑(sum2[j])+2∗d∑sum[j]+num∗d2∑(sum2[j])+2∗d∑sum[j]+num∗d2
那么我们只需要再维护每个点子树的val和的和就可以+lazy修改了
每个点子树的val和的和也很好弄直接区间加lazy就好
查询?
根据暴力推一下,ss,ffss,ff又减又加的,最后会消除一些
设根为1的答案为ans1ans1,当前询问的点到根的路径上有xx个点,分别标成u1到ux,u1就是1,ux就是当前点u1到ux,u1就是1,ux就是当前点,sum[i]表示i子
树的val和sum[i]表示i子树的val和
那么ans=ans1−∑xi=1sum2[ui]+∑xi=2(sum[u1]−sum[ui])ans=ans1−∑i=1xsum2[ui]+∑i=2x(sum[u1]−sum[ui])(很好推的)
化简一下
ans=ans1−sum2[u1]∗(x−1)−2∗sum[u1]∑xi=2sum[ui]ans=ans1−sum2[u1]∗(x−1)−2∗sum[u1]∑i=2xsum[ui]
sumsum和线段树+链剖查询就好了
su