牛客CSP-S提高组赛前集训营5 C 神J上树【树链剖分+倍增/单调栈/区间取min线段树】

23 篇文章 0 订阅
19 篇文章 1 订阅
题目描述:

链接:牛客CSP-S提高组赛前集训营5
神树大人和神J来到了神仙树公园。遗憾的是,神仙树公园里没有任何神仙树,只有一棵n个点的普普通通的有根树(以1号点为根)。这棵树每条边有边权。神J打算在这棵树上来回横跳,但神J每次只能从一个节点u跳到它的子孙v,代价为u×dist(u,v)。v是u的子孙当且仅当u在v到根节点的路径上。
神J提出了m个询问,每次询问两个点s,t,由于你是神树大人和神J的司机,所以神J想让你尽快告诉他是否能从s到t,如果能到则最小代价为多少。

题目分析:

先树链剖分,把树上路径转化为链上问题。

观察(乘法分配律)可以得出从s点开始,遇到点编号比s小的就跳是最优的,于是倍增的想法就是预处理当前点往下跳2i步走到的位置以及路上经过的代价。

也可以存下每条重链的单调栈(点标由上到下单调递减)以及代价的前缀和,二分在单调栈中的位置。

或者可以考虑每条边对答案的贡献,离线询问在起点处查询,先处理子树,用线段树维护可以走过每条边的最小点标和乘积之和,然后用当前点的点标去更新子树中的边的点标,更新的时候,线段树中记录点标最大值mx和次大值cx,以及点标为mx的边的和,如果当前点的id>=mx,显然不用更新,如果cx<=id<mx,那么直接将点标为mx的边改为id,并打上懒标记,如果id<cx,则需要递归两个儿子,虽然需要递归两边,但是势能分析可知区间取min的复杂度是nlogn的:记势能为儿子与父亲的mx不同的个数,需要递归两个儿子(并继续往下)的情况只能是两个儿子的最大值都大于id,更新之后两个儿子和父亲的mx就都等于id,所以一次这样的修改会减小一个势能,而一个势能会有log的复杂度,当势能为0时,意味着次大值为0,可以O(1)区间修改最大值。

上述nlogn方法外层套上一个log的树链剖分,复杂度nlog2n。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值