BZOJ 4999 LCA树状数组差分维护DFS序

Description

给一颗树,每个节点有个初始值
现在支持以下两种操作:
1. C i x(0<=x<2^31) 表示将i节点的值改为x
2. Q i j x(0<=x<2^31) 表示询问i节点到j节点的路径上有多少个值为x的节点

Input

第一行有两个整数N,Q(1 ≤N≤ 100,000;1 ≤Q≤ 200,000),分别表示节点个数和操作个数
下面一行N个整数,表示初始时每个节点的初始值
接下来N-1行,每行两个整数x,y,表示x节点与y节点之间有边直接相连(描述一颗树)
接下来Q行,每行表示一个操作,操作的描述已经在题目描述中给出

Output

对于每个Q输出单独一行表示所求的答案

 

解:

考虑离线 将修改操作变成一个颜色的删除操作和另一个颜色的加入操作 然后将所有操作和询问都按颜色和时间排序 分别处理每一个颜色

Query(x,y)=Query(x)+Query(y)- Query(lca(x,y))-Query(fa[lca(x,y)])

posted @ 2018-06-06 18:04  Aragaki  阅读(...)  评论(...编辑  收藏