版权声明:因为我是蒟蒻,所以请大佬和神犇们不要转载(有坑)的文章,并指出问题,谢谢 https://blog.csdn.net/Deep_Kevin/article/details/83868233
正题
题目是这样的:
Rose一共有n个礼物,他女朋友也有n个礼物。
这些礼物有两个权值,x表示的是该礼物在Rose眼里的重要度,y表示的是该礼物在其女朋友眼里的重要度。
当一个人收到自己眼里价值为的礼物时,会回赠在自己眼里在的礼物。
当一个人收到自己眼里价值为0的礼物时,会觉得对方没有诚意,所以就会停止送礼物。
问Rose先送第i个礼物给其女朋友,最快什么时候会结束送礼物。(操作由你决定。
题解:
我们把Rose和其女朋友的礼物分成两堆点,那么我们可以对这两堆点进行连边。
边表示什么呢?
表示的是,当送i礼物的时候,另一方可以回赠j礼物。那么我们从i到j建一条权值为1的边。
特殊的,左边的y权为0的点和右边x权为0的点向ed连一条权值为1的边,表示结束。
因为是求多个点到一个点ed的最短路,所以我们把边反着建,求ed到多个点的最短路就是答案了。
好的,因为数据过水,已经是正解了。
考虑线段树优化建图,左边按x来排序,右边按y来排序,那么当从左边向右边连边的时候,连的一定是连续的一段点。
右边往左边也一样,那么这两个端点可以通过二分查找。
线段树优化一下建图就可以了。
最后,因为线段树里面的边是0边,其他的边都是1边,要跑最短路?
不用,跑双端队列bfs就可以了,相关证明无处可寻,感性理解即可。