[POI2010]Frog
题目大意:
一个数轴上有n个点,现在你要在这些点上跳。
每次跳的时候你只能跳到离这个点第k近的点上,而且要连续跳m次。
问从每一个点出发,最后分别会在哪一个点结束。
思路:
首先可以维护一个大小为k+1的队列,使得离当前点第k远的点一定在这个队列中。
显然当i=1时,队列的范围是[1,k+1],然后当pos[i]-pos[l]>pos[l+k+1]-pos[i]时,队列往右移一个点。
至于第k近的点,则要么是左端点,要么是右端点,只要比一下哪个更远即可。
这样就可以O(n)地求出离每个点第k近的点。
但是现在我们要跳m次,而m很大,很显然不能暴力跳,而用LCA之类的也不行,因为到最顶上是一个环。
考虑把每一次跳的过程看作一个置换,那么总共要进行m次置换。
而这些置换可以通过类似于快速幂的方法实现。
把所有的点置换一次是O(n)的,总共会有O(log m)次置换,所以时间复杂度是O(n log m)的。
#include<cstdio>
#include<cctype>
typedef long long int64;
inline int64 getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int64 x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=;
int64 pos[N];
int next[N],tmp[N],ans[N];
int main() {
const int n=getint(),k=getint();
register int64 m=getint();
for(register int i=;i<=n;i++) pos[i]=getint();
for(register int i=,l=;i<=n;i++) {
while(l+k<n&&pos[i]-pos[l]>pos[l+k+]-pos[i]) l++;
next[i]=(pos[i]-pos[l]>=pos[l+k]-pos[i])?l:l+k;
}
for(register int i=;i<=n;i++) ans[i]=i;
for(;m;m>>=) {
if(m&) {
for(register int i=;i<=n;i++) {
ans[i]=next[ans[i]];
}
}
for(register int i=;i<=n;i++) tmp[i]=next[next[i]];
for(register int i=;i<=n;i++) next[i]=tmp[i];
}
for(register int i=;i<=n;i++) {
printf("%d%c",ans[i]," \n"[i==n]);
}
return ;
}
[POI2010]Frog的更多相关文章
- bzoj2093: [Poi2010]Frog(单调队列,倍增)
2093: [Poi2010]Frog Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 568 Solved: 186[Submit][Status] ...
- BZOJ 2093: [Poi2010]Frog
Description 从一个点到达与他距离第 \(k\) 小的点,问从每个点跳 \(m\) 次到达那个点. Sol 队列+倍增. 保持队列里的元素个数为 \(k\) ,从前往后扫不难发现左右端点都是 ...
- BZOJ2093 : [Poi2010]Frog
从左往右维护两个指针l,r表示离i最近的k个点的区间,预处理出每个点出发的后继,然后倍增. #include<cstdio> typedef long long ll; const int ...
- bzoj 2093 [Poi2010]Frog——滑动窗口
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2093 找第k近的可以用一个含k个元素的滑动窗口来实现. 卡空间也还行,但卡时间.不要预处理倍 ...
- POI2010题解
POI2010题解 我也不知道我为什么就开始刷POI了 有些题目咕掉了所以不完整(我都不知道POI到底有多少题) [BZOJ2079][Poi2010]Guilds (貌似bz跟洛谷上的不是一个题?) ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 倍增&矩阵乘法 专题复习
倍增&矩阵乘法 专题复习 PreWords 这两个基础算法我就不多说啦,但是还是要介绍一下" 广义矩阵 "乘法 其实就是把矩阵换成取\(max\),然后都一样... 据神仙 ...
- [LeetCode] Frog Jump 青蛙过河
A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...
- BZOJ 2080: [Poi2010]Railway 双栈排序
2080: [Poi2010]Railway Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 140 Solved: 35[Submit][Statu ...
随机推荐
- JAVA中string.replace()和string.replaceAll()的区别及用法
乍一看,字面上理解好像replace只替换第一个出现的字符(受javascript的影响),replaceall替换所有的字符,其实大不然,只是替换的用途不一样. public String r ...
- oracle的sequece的使用(主键自增长)
在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方. 1.Create Sequence (注释:你需要有CREATE S ...
- 存储过程-----DECLARE---实用注意事项
定义与使用变量时需要注意以下几点: ◆ DECLARE语句必须用在DEGIN…END语句块中,并且必须出现在DEGIN…END语句块的最前面,即出现在其他语句之前. ◆ DECLARE定义的变量的作用 ...
- WebKit学习资源
1.http://blog.csdn.net/dlmu2001/article/category/741748 红心地瓜 2.http://blog.csdn.net/cnnzp/article ...
- 五分钟搞懂Vuex
这段时间一直在用vue写项目,vuex在项目中也会依葫芦画瓢使用,但是总有一种朦朦胧胧的感觉.于是决定彻底搞懂它. 看了一下午的官方文档,以及资料,才发现vuex so easy! 作为一个圈子中的人 ...
- css3 新旧伸缩盒的异同
由于不需要理会IE浏览器,伸缩盒(flexible box)移动端开发中非常好用! 工作中使用APICLOUD开发手机App,老板要求兼容到安卓2.3(新版的需要安卓4.4以上),所以一直使用的是旧版 ...
- Intelij idea新窗口打开项目设置
1.idea 打开后 file->setting 2.appearance&behave->system setting->open project in new win ...
- 【uva11732-"strcmp()" Anyone?】Trie
http://acm.hust.edu.cn/vjudge/problem/28438 题意:给定n个字符串,问用strcmp函数比较这些字符串共用多少次比较. 题解: 插入一个‘#’作为字符串的结束 ...
- 【BZOJ】1691: [Usaco2007 Dec]挑剔的美食家
[算法]扫描线+平衡树(set) [题解]很明显的二维偏序数点,排序后扫描线,现加点后查询答案. 则问题转化为一维偏序,显然贪心找第一个比当前大的最优,所以用平衡树维护. 记得开multiset!!! ...
- GUI自动化模块化实现方式
效率为王:脚本与数据的解耦 + Page Object模型 1.数据驱动:实现了“测试脚本和数据的解耦”,数据驱动测试的数据文件中不仅可以包含测试输入数据,还可以包含测试验证结果数据,甚至可以包含测试 ...