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