题目大意:
  一个数轴上有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的更多相关文章

  1. bzoj2093: [Poi2010]Frog(单调队列,倍增)

    2093: [Poi2010]Frog Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 568  Solved: 186[Submit][Status] ...

  2. BZOJ 2093: [Poi2010]Frog

    Description 从一个点到达与他距离第 \(k\) 小的点,问从每个点跳 \(m\) 次到达那个点. Sol 队列+倍增. 保持队列里的元素个数为 \(k\) ,从前往后扫不难发现左右端点都是 ...

  3. BZOJ2093 : [Poi2010]Frog

    从左往右维护两个指针l,r表示离i最近的k个点的区间,预处理出每个点出发的后继,然后倍增. #include<cstdio> typedef long long ll; const int ...

  4. bzoj 2093 [Poi2010]Frog——滑动窗口

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2093 找第k近的可以用一个含k个元素的滑动窗口来实现. 卡空间也还行,但卡时间.不要预处理倍 ...

  5. POI2010题解

    POI2010题解 我也不知道我为什么就开始刷POI了 有些题目咕掉了所以不完整(我都不知道POI到底有多少题) [BZOJ2079][Poi2010]Guilds (貌似bz跟洛谷上的不是一个题?) ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. 倍增&矩阵乘法 专题复习

    倍增&矩阵乘法 专题复习 PreWords 这两个基础算法我就不多说啦,但是还是要介绍一下" 广义矩阵 "乘法 其实就是把矩阵换成取\(max\),然后都一样... 据神仙 ...

  8. [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 ...

  9. BZOJ 2080: [Poi2010]Railway 双栈排序

    2080: [Poi2010]Railway Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 140  Solved: 35[Submit][Statu ...

随机推荐

  1. JAVA中string.replace()和string.replaceAll()的区别及用法

    乍一看,字面上理解好像replace只替换第一个出现的字符(受javascript的影响),replaceall替换所有的字符,其实大不然,只是替换的用途不一样.    public String r ...

  2. oracle的sequece的使用(主键自增长)

    在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方. 1.Create Sequence (注释:你需要有CREATE S ...

  3. 存储过程-----DECLARE---实用注意事项

    定义与使用变量时需要注意以下几点: ◆ DECLARE语句必须用在DEGIN…END语句块中,并且必须出现在DEGIN…END语句块的最前面,即出现在其他语句之前. ◆ DECLARE定义的变量的作用 ...

  4. WebKit学习资源

    1.http://blog.csdn.net/dlmu2001/article/category/741748    红心地瓜 2.http://blog.csdn.net/cnnzp/article ...

  5. 五分钟搞懂Vuex

    这段时间一直在用vue写项目,vuex在项目中也会依葫芦画瓢使用,但是总有一种朦朦胧胧的感觉.于是决定彻底搞懂它. 看了一下午的官方文档,以及资料,才发现vuex so easy! 作为一个圈子中的人 ...

  6. css3 新旧伸缩盒的异同

    由于不需要理会IE浏览器,伸缩盒(flexible box)移动端开发中非常好用! 工作中使用APICLOUD开发手机App,老板要求兼容到安卓2.3(新版的需要安卓4.4以上),所以一直使用的是旧版 ...

  7. Intelij idea新窗口打开项目设置

    1.idea 打开后 file->setting   2.appearance&behave->system setting->open project in new win ...

  8. 【uva11732-"strcmp()" Anyone?】Trie

    http://acm.hust.edu.cn/vjudge/problem/28438 题意:给定n个字符串,问用strcmp函数比较这些字符串共用多少次比较. 题解: 插入一个‘#’作为字符串的结束 ...

  9. 【BZOJ】1691: [Usaco2007 Dec]挑剔的美食家

    [算法]扫描线+平衡树(set) [题解]很明显的二维偏序数点,排序后扫描线,现加点后查询答案. 则问题转化为一维偏序,显然贪心找第一个比当前大的最优,所以用平衡树维护. 记得开multiset!!! ...

  10. GUI自动化模块化实现方式

    效率为王:脚本与数据的解耦 + Page Object模型 1.数据驱动:实现了“测试脚本和数据的解耦”,数据驱动测试的数据文件中不仅可以包含测试输入数据,还可以包含测试验证结果数据,甚至可以包含测试 ...