在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i]。
不幸的是,这片土地常常发生地震,并且随着时代的发展,城市的价值也往往会发生变动。
接下来你需要在线处理M次操作:
0 x k 表示发生了一次地震,震中城市为x,影响范围为k,所有与x距离不超过k的城市都将受到影响,该次地震造成的经济损失为所有受影响城市的价值和。
1 x y 表示第x个城市的价值变成了y。
为了体现程序的在线性,操作中的x、y、k都需要异或你程序上一次的输出来解密,如果之前没有输出,则默认上一次的输出为0。
第一行包含两个正整数N和M。
第二行包含N个正整数,第i个数表示value[i]。
接下来N-1行,每行包含两个正整数u、v,表示u和v之间有一条无向边。
接下来M行,每行包含三个数,表示M次操作。
包含若干行,对于每个询问输出一行一个正整数表示答案。
1<=N,M<=100000
1<=u,v,x<=N
1<=value[i],y<=10000
0<=k<=N-1
最近敲这种一言不合代码就150+的点分树题已经麻木了QAQ
对于每个重心我们开两颗线段树(动态开):
一颗线段树中,对点分树中以u为根的子树中的节点v,我们以他距u的距离为下标,点权为值插入线段树
另一颗里,对点分治中以u为根的子树中的节点v,我们以他距u的父亲节点距离为下标,点权为值插入线段树
然后?你问我然后?
然后就修改暴力爬树高修改
然后就查询暴力爬树高查询,并消除上一层在当前层中重复的部分,统计答案就好
这种暴力爬树高,消除子树影响的方法其实很套路,建议先用点分树切掉bzoj3924或者看我这篇题解,然后搞这道题,具体过程依旧不细说,自己写的总是好,要攒人品。
代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include