[NOIP2015][Vijos1977]推销员(heap)

这篇博客讨论了NOIP2015年Vijos1977题目的解法,主要聚焦于如何使用堆来解决推销员在不同城市行走的最远距离问题。博主指出,可以使用两个大根堆,分别存储权值和权值加路径长度,通过动态维护堆,保证每次决策最优,最终实现O(nlogn)的时间复杂度。文章强调了分析问题本质和递推思路的重要性。
摘要由CSDN通过智能技术生成

题目描述

传送门

题解

感觉vijos上的数据比较强,Po的代码在别的网站上过了但是在这里总是wa一组。最后好像是因为一个奇怪的边界问题。
分析题目我们可以发现,假设说推销i个人的时候最远走到了第x个点,那么推销i+1个人的时候就有两种选择:在1~x-1这些点中选一个权值的点,或者在x+1~n这些点中选一个权值+多出来的路程最大的点。这两个选择中选比较大的那个。如果相等的话,选的点越靠后越好一定是更优的。
到这一步之后就是线段树裸题啊对不对,不过更聪明一点可以直接用两个大根堆来实现。也就是说,左边的堆权值就是点的权值,右边的堆权值是点的权值+路径长度。由于可以证明最远到达的点一定是不降的,所以可以一直从左向右移动就可以了。每一次通过打标记使左边的堆里有效元素只有1~x-1中的点,右边的堆里有效元素只有x+1~n中的点。
每个点只会入堆出堆至多两次,时间复杂度 O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值