NOI2014购票

本文探讨了NOI2014活动的购票问题,重点分析了一道压轴题目,该题目看似简单的树形动态规划,实则蕴含复杂策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是NOIday2压轴题了,粗看之下不就就是树形dp吗?

s[x]=min{s[t]+p[x](l[x]l[t])}+q[x],(tx.fathers)

一看n的大小:200000,哎啊妈呀O(n2)TLE,得赶紧找优化:
kj在树上的子孙结点,若有
s[k]+p[x](l[x]l[k])<s[j]+p[x](l[x]l[j])

也即:
s[k]s[j]<p[x](l[k]l[j])s[k]s[j]l[k]l[j]<p[x]

我们看到了什么?对,斜率优化.
这样,我们在计算s[x]时就需要维护一个凸包了.凸包上的点以l[x]为横坐标,以s[x]为纵坐标,当然对根也即1结点,它就是原点(0,0)
这里写图片描述
这是一个凸包(省略了坐标轴)
到这里,我们再回顾下题目,什么!?还有距离限制!那么等于说我们不能只简单的维护一个凸包了,这对我们来说是个打击.不过没关系,我们加上距离限制,那么我们只能使用凸包的一段…不仔细想一下,当我们截去凸包的一段时,有可能加入新的可行点!这里写图片描述
我们从红色箭头所指的地方截断凸包,但我们发现,原来插入结点时所删去的两个结点是有可能作为答案的!例如:这里写图片描述
在这里,我们发现新加入的第二个点就是答案因此,我们所面对的问题在加入了距离限制后变得棘手的多了,当然,这也是此题的魅力所在.
我们来考虑这个问题怎么处理:
凸包是可合并的,即我们从两个凸包中分别获得了答案但最后,我们选择了上面的结点
凸包5
嘿!我们就可以使用线段树了!我么要开一个O(nlogn)大小的线段树,线段树的结点保存对应区间的凸包(准确的说是点序列).考虑到凸包的可合并性,我相信你很快能想到如何在该线段树中寻找答案,用时应该是O(log2n)的.
我们考虑如何在线段树中插入一个结点,这并不难,我们自上到下向线段树中插入结点,但是!这是一棵树!树是有分岔的!当我们算完一条树链时,我们要返回到分岔点,在这之中,必应有结点的重新插入!如图:这里写图片描述
我们不可能真的将它们重新插入,那么我们在插入时就要小心,保存好插入新的结点时在线段树中覆盖的原位置数据和原凸包长度,在我们删除结点时应该将它们恢复,这样,我们每一次插入用时O(log2n),删除用时O(logn),这对n<100000已经足够了.(本人比较菜,神犇请勿吐槽)
这里写图片描述
我们回头来看我们的线段树,其实这就是可持久化线段树的一种,因为我们还要不断用到以前的版本(恢复结点).当然主席树(函数式线段树)也是可持久化线段树的一种,它由fotile主席发明,可以做到O(logn)时间内求给定区间第k大.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值