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

探讨了一种基于礼物交换的游戏情景,通过构建图模型并利用最短路径算法,解决了一个有趣的问题:如何确定从特定礼物开始,两人之间的礼物交换何时会因缺乏诚意而终止。文章介绍了使用线段树优化建图过程,并采用双端队列BFS算法找到最短路径。

正题

      题目是这样的:

      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就可以了,相关证明无处可寻,感性理解即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值