ZOJ4048 Red Black Tree
标签
- LCA
- 二分答案
简明题意
- 给一棵树,给边权。树上的点分为黑点和红点,对于每一个点,他有一个cost。红点的cost为0,黑点的cost为他到他第一个红色祖先的路径和。现在有多组询问,每组询问给你k个点,问这k个点中,最大的花费最小是多少。
思路
- 首先,最大花费的最小值果断二分,难点在于check
- check函数,对于每一个最小值x,我们需要判断所给点集到其第一个红色祖先的距离是否<=x,然后把所有>x的点记下来(这个点集记为p),为了让这些点到第一个红色祖先的距离最小,我们必须要让新放置的红点能够影响到所有的p,怎么做到呢?答案是将LCA处置为红色,这样是最优的。
- 下一个问题是,如何查询每个点到最近的红色祖先的距离。这个我们可以直接在dfs1中预处理出来,在dfs1的参数中加一个参数w,一旦遇到红点,w置0
- 再下一个问题,如何在check函数中查询每个点到新的红点的距离?同样我们在dfs1中预处理出所有节点到根节点的距离,这样就可以直接用dis[lca] - dis[p]得到新的距离。
注意事项
- 无
总结
- 对于树上的不带修的路径查询,可以直接dfs一遍,求出根节点到每个节点的路径长度,然后就能O(1)求出。
- 同样用刚刚的dfs,可以预处理每个点到最近的某种祖先的路径。
AC代码
- 然而这题我并没能AC,而是TLE了,然后呢我把网上的题解交上去,也全部TLE…
双倍经验
- 无