zoukankan      html  css  js  c++  java
  • 【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)。

       

  • 相关阅读:
    关于按钮背景透明 + div拖拽
    asp.net 自带ajax 控件的小实例
    何去何从
    字符串的常用操作
    第一章
    C语言的基础知识2
    C语言的基础知识1
    socket
    缓冲区溢出学习
    OD调试
  • 原文地址:https://www.cnblogs.com/LQLlulu/p/9031788.html
Copyright © 2011-2022 走看看