凸包问题的回溯操作

题意:一棵树,求每个点到祖先节点 v u c[v]c[u]/dis(v,u) min 值.

昨天考试的第三题,已经看出来是维护上凸包,但是对于 dfs 回溯时凸包怎么去维护只会暴力拿栈维护(但是好像对于随机数据时间复杂度为 O(nlog2n )),然而正解做法就是用了一个可持久化栈.

其实,可持久化栈就是一棵树,对于回溯操作就相当于回到祖先,而加入新节点 u ,直接接在上一个状态节点的下面,然后直接倍增二分(新姿势),找到最优节点 v ,而可持久化栈中的 u v 的这段路径,其实就是在正常加入 u 所需要弹出栈的那些元素,这样就可以直接倍增二分来找到最优解,直接接在那个点下面即可.

倍增二分:
从二进制高位向地位扫,比较当前最优节点的倍增节点 u u 的父亲 v 谁更优,如果 v 更优,则保持二进制不变(因为他的这一段仍可能成为最优解),然后将最优节点赋成 v ,否则就降低一位二进制位,继续对于 u 倍增.

发布了51 篇原创文章 · 获赞 6 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_35776579/article/details/78168303