P4345[Ipsc2015]Generating Synergy
问题描述
给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色
输入格式
第一行一个数T,表示数据组数
接下来每组数据的第一行三个数n,c,q表示结点个数,颜色数和操作数
接下来一行n-1个数描述2..n的父节点
接下来q行每行三个数a,l,c
若c为0,表示询问a的颜色
否则将距离a不超过l的a的子节点染成c
输出格式
设当前是第i个操作,y_i为本次询问的答案(若本次操作是一个修改则y_i为0),令z_i=i*y_i,请输出z_1+z_2+…+z_q模10^9+7
样例输入
1
4 3 7
1 2 2
3 0 0
2 1 3
3 0 0
1 0 2
2 0 0
4 1 1
4 0 0
样例输出
32
提示
第1,3,5,7的询问的答案分别为1,3,3,1,所以答案为 11+20+33+40+53+60+7*1=32.
数据范围:
对于100%的数据T<=6,n,m,c<=10^5,
1<=a<=n,0<=l<=n,0<=c<=c
首先求出这棵树的DFS序和每个节点的深度,那么将DFS序的$In$作为$x$坐标,将深度作为$y$坐标,建立kd树,那么每次询问直接找对应点,修改就变成将以$(In[a],dep[a])$,$(Out[a],dep[a]+l)$为左上和右下顶点的矩形区域整体修改,kd树+lazy即可解决。
另外,也可以用树套树维护,但显然不如kd树好写。
代码:
1 |
|