C: 可以避免用浮点
D:推荐逐格递推法,想学的话去http://blog.csdn.net/crazy_ac/article/details/9819191
E:Qtree 5的弱化版,顺便问一句。。。CF真是没题出了么??
这个题由于是弱化版,没有向qtree 5那样对某个点的颜色取反,所以有一种简易的lct写法,我是跟小水大神学的。。学会了lct,我的splay写法也可以改观很多了
这个题用lct来做的话需要维护两个信息
1:某个点子树内的最浅的红点的深度
2:splay的子树中最小的ans
ans的值是这么算得,因为两个点之间的距离是dep[u] + dep[v] - 2 * dep[lca];
所以如果v是红点,我们只需要维护一个dep[v]-2*dep[lca]最小值即可
另外,pushdown的时候需要O(1)维护子树的ans值,仔细想一下,最有可能更新答案的肯定是当前链中深度最大的点,因为一开始要更新的点肯定是在链的最底部的
每次更新一个点实际上就是更新了所有的父亲节点方向的信息,只管access到根,然后放下去一个标记即可*_*
done!
代码见
https://github.com/becauseofyou/Contests/tree/master/Codeforces/CF_199div2