20160410模拟

来源:互联网 发布:godaddy设置php 编辑:程序博客网 时间:2024/06/05 10:29

T1/T3我都不想写(会)就写写T2吧

T2 环游世界(around)

  • 题目大意
    • 给定一个n个点的环以及相邻两点间的距离,多次询问,从任意点出发,每次给定最远跳的距离s,询问最少落地次数
  • 题解
    • 考的时候我是这么做的
      • dp[i]=min{dp[j]+1}    (sum[i]sum[j]s)
      • 这个东西可以单调队列优化到O(N)
        • 用判断条件从队尾踢人
        • dp值从队头踢人
        • 每次从队头取出元素更新当前dp
      • 枚举起点开始跳
      • 这么做的复杂度为O(N2Q),30pt
      • 当复杂度过大时随机4次开始位置
      • 最终得分60pt
    • 题解是这么说的
      • 环拆成链后,可以利用单调性O(N)求出每个点最远向后跳到哪个点
      • 然后连一条从这个点到它最远到的点的边
      • 由于每个点的最远点只有一个,所以这是棵树
      • 原问题就转化为从一个点最少向上走几步使得到达的点的编号i+n
      • 这个怎么求呢?我们记录每个点在树中的深度,每次向上查找
      • 然而这个复杂度会退化
      • 我们加个类似并查集路径合并的小优化
      • 首先很明显dep[i]dp[i+1],当我们依次查找in的满足条件的节点的位置一定是不降的,所以每次将查找路径上的点全都指向该次查找的结果位置对之后的查找是不影响的
      • O(MNα(N))(题解里就当成并查集的复杂度了……至于正确性我……)
  • CODE
0 0
原创粉丝点击