您的位置:首页 > 其它

20160410模拟

2016-04-10 16:17 183 查看
T1/T3我都不想写(会)就写写T2吧

T2 环游世界(around)

题目大意

给定一个nn个点的环以及相邻两点间的距离,多次询问,从任意点出发,每次给定最远跳的距离ss,询问最少落地次数

题解

考的时候我是这么做的

dp[i]=min{dp[j]+1} (sum[i]−sum[j]≤s)dp[i]=\min\{dp[j]+1\}~~~~(sum[i]-sum[j]\le s)

这个东西可以单调队列优化到O(N)O(N)

用判断条件从队尾踢人

用dpdp值从队头踢人

每次从队头取出元素更新当前dpdp值

枚举起点开始跳

这么做的复杂度为O(N2Q),30ptO(N^2Q),30pt

当复杂度过大时随机4次开始位置

最终得分60pt60pt

题解是这么说的

环拆成链后,可以利用单调性O(N)O(N)求出每个点最远向后跳到哪个点

然后连一条从这个点到它最远到的点的边

由于每个点的最远点只有一个,所以这是棵树

原问题就转化为从一个点最少向上走几步使得到达的点的编号≥i+n\ge i+n

这个怎么求呢?我们记录每个点在树中的深度,每次向上查找

然而这个复杂度会退化

我们加个类似并查集路径合并的小优化

首先很明显dep[i]≤dp[i+1]dep[i]\le dp[i+1],当我们依次查找i→ni\rightarrow n的满足条件的节点的位置一定是不降的,所以每次将查找路径上的点全都指向该次查找的结果位置对之后的查找是不影响的

复杂度O(MNα(N))复杂度O(MN\alpha(N))(题解里就当成并查集的复杂度了……至于正确性我……)

CODE
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: