NOIP模拟赛,礼物,线段树优化建图

版权声明:因为我是蒟蒻,所以请大佬和神犇们不要转载(有坑)的文章,并指出问题,谢谢 https://blog.csdn.net/Deep_Kevin/article/details/83868233

正题

      题目是这样的:

      Rose一共有n个礼物,他女朋友也有n个礼物。

      这些礼物有两个权值(x,y),x表示的是该礼物在Rose眼里的重要度,y表示的是该礼物在其女朋友眼里的重要度。

      当一个人收到自己眼里价值为k的礼物时,会回赠在自己眼里在[k,k+d]的礼物。

      当一个人收到自己眼里价值为0的礼物时,会觉得对方没有诚意,所以就会停止送礼物。

      问Rose先送第i个礼物给其女朋友,最快什么时候会结束送礼物。(操作由你决定。

      n<=10^5,x,y<=10^9,d<=10^9

      题解:

      我们把Rose和其女朋友的礼物分成两堆点,那么我们可以对这两堆点进行连边。

      边表示什么呢?

      表示的是,当送i礼物的时候,另一方可以回赠j礼物。那么我们从i到j建一条权值为1的边。

      特殊的,左边的y权为0的点和右边x权为0的点向ed连一条权值为1的边,表示结束。

      因为是求多个点到一个点ed的最短路,所以我们把边反着建,求ed到多个点的最短路就是答案了。

      好的,因为数据过水,已经是正解了

      考虑线段树优化建图,左边按x来排序,右边按y来排序,那么当从左边向右边连边的时候,连的一定是连续的一段点。

      右边往左边也一样,那么这两个端点可以通过二分查找。

      线段树优化一下建图就可以了。

      最后,因为线段树里面的边是0边,其他的边都是1边,要跑最短路?

      不用,跑双端队列bfs就可以了,相关证明无处可寻,感性理解即可。

猜你喜欢

转载自blog.csdn.net/Deep_Kevin/article/details/83868233
今日推荐