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