ZOJ4048 Red Black Tree LCA+二分答案


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…

双倍经验

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值