T1/T3我都不想写(会)就写写T2吧
T2 环游世界(around)
- 题目大意
- 给定一个
n
个点的环以及相邻两点间的距离,多次询问,从任意点出发,每次给定最远跳的距离
s ,询问最少落地次数
- 给定一个
n
个点的环以及相邻两点间的距离,多次询问,从任意点出发,每次给定最远跳的距离
- 题解
- 考的时候我是这么做的
- 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] ,当我们依次查找 i→n 的满足条件的节点的位置一定是不降的,所以每次将查找路径上的点全都指向该次查找的结果位置对之后的查找是不影响的
- 复杂度O(MNα(N)) (题解里就当成并查集的复杂度了……至于正确性我……)
- 考的时候我是这么做的
- CODE