• 【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)。

       

  • 相关阅读:
    qemu-kvm磁盘读写的缓冲(cache)的五种模式
    关于追踪qemu 源码函数路径的一个方法
    准备升大三啦
    关于Vim的一个配置文件
    POJ 3253
    hihocoder 第二十五周 spfa 最短路
    POJ 2718 穷举
    《鸟哥Linux私房菜基础学习篇》命令索引
    博文流
    《SDN核心技术剖析和实战指南》3.3读书笔记
  • 原文地址:https://www.cnblogs.com/LQLlulu/p/9031788.html
Copyright © 2020-2023  润新知