题目链接
我们可以考虑一个黑点u,它作为LBCA点所产生贡献次数为,其中,指的是u的子孙节点们,那么,u点作为LBCA点的贡献值就可以求出来了,就是了。
根据这样的关系,我们可以推导改变所带来的信息变化。
那么,它的影响只会对它向上最近的黑色节点产生直接影响,对于再往上的黑色节点,由于被给阻断了,所以受不到影响,同时,它会产生贡献,它产生的贡献就可以通过来计算得到。
对于节点的影响呢?那么,其实相当于节点就会少去了这些部分了,所以它要减去的部分,似乎这样就达成了一个能量守恒,一个加,一个减去,所以确确实实对之上的黑点就没有影响了。
我们看到白点变黑点时候的变化,那么黑点变白点可以考虑成“白点变黑点的逆变换”。
于是,我们先对加上的贡献,然后再是对u节点减去它的这些贡献次数,因为它要变成白点了呀。
所以,这个问题全程围绕着这个关键的等式展开,求解了这些问题。
然后关于怎么去找点,这个可以用树剖去找dfs序最大的点,那么就一定同时满足深度最深的黑点(dfs序和深度关系),也就是距离u最近的黑点了。
剩下的一些,几乎都是单点修改和区间更新的问题了,可以使用dfs序维护出来的线段树来解决该问题。
给几组测试数据:
/*
4 4
1 2 3
1 2 5 5
Q 2
F 3
M 3 11451
Q 2
*/
/*
5 4
1 1 2 2
3 1 2 4 2
F 1
M 1 2
F 4
Q 2
ans:
6
*/
/*
6 4
1 1 2 2 3
6 5 4 3 2 1
F 2
F 3
F 1
Q 1
ans:
85
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include