20160410模拟

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值