• 【HDU5361】In Touch


     题意
    有n个人住在一条直线上,从左到右编号为1,2,3....n                                                                                                                                                  
    两个相邻的人距离为1米,每个人都有一个电话,第i个人可以给它距离大于等于li且小于等于ri的人打电话,花费为ci.
    现在第一个人想知道给每个人打电话的花费最小值是多少
    n<= 2*10^5
    0<=li<=ri<=n

    分析

        这个题乍一看以为是单源最短路的模板题,但是看了数据规模发现没法建图。

        我们来找这个题和普通最短路的一个区别:从某个点到它所能到达的任何一个点的花费是相同的。那么我们让d[i]为到i的花费+c[i](c[i]是从i向别的点打电话的花费)。如果这样跑dijstra的话,每次从队列中取出来的一个点,都已经是最优了,以后的所有操作都不需要再对它进行松弛操作。所以说,每个点只需要被更新一边。如果这样的话时间复杂度就是O(N)的。但是如何实现这个“被更新过的点不会被再次更新”?

       然后我发现,无论如何记录或者什么的,都没法做到。。。(自己太菜了)

       然后看别人的代码,发现了神奇的并查集优化ORZ

       int pos=find(i)可以理解为,i结点右边最近的一个还没被更新的点是哪个。然后每次更新i以后都进行一个操作p[find(i)]=find(i+1)。

       

  • 相关阅读:
    Python3学习笔记24-操作文件和目录
    Python3学习笔记23-StringIO和BytesIO
    [Uva10934]Dropping water balloons
    [Uva10641]Barisal Stadium(区间dp)
    [hdu4960]Another OCD Patient(区间dp)
    [cf687c]The Values You Can Make(01背包变形)
    [Gym 101334E]Exploring Pyramids(区间dp)
    [bzoj4806]炮
    [hdu4662]MU Puzzle(找规律)
    [Uva12260]Free Goodies(dp+贪心)
  • 原文地址:https://www.cnblogs.com/LQLlulu/p/9031788.html
Copyright © 2020-2023  润新知