bzoj2093: [Poi2010]Frog(单调队列,倍增)
2093: [Poi2010]Frog
Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 568 Solved: 186
[Submit][Status][Discuss]
Description
一个条河无限宽,上面有n块石头,石头离左边的河岸(无限宽,右边河岸不晓得在哪)距离严格递增,现在Zxl想锻炼自己的跳跃能力(谁叫他在班里外号是鸟怪。。畸形),他在某一块石头上,想跳到离他这块石头第k远的石头上去,假如离他第k远的石头不是唯一的,他就选离岸最近的那一个(不然回不去了),他想你让他知道,从每块石头开始跳了m次后,自己在哪。
Input
第一行有3个由空格隔开的整数n, k (n, k <= 1,000,000), m (m <= 10^18)。
第二行有n个正整数,第i个数表示第i块石头离左岸的距离,保证输入的n个正整数严格递增,并且不超过10^18。
Output
一行n个由空格隔开的整数,第i个表示Zxl从第i块石头开始跳,跳m次后会在哪个石头上。
Sample Input
1 2 4 7 10
Sample Output
/*
如何求处离当前点第k近的点呢?
答案是单调队列。因为离远点距离单调不减 所以可以维护一个长度为k+1的单调队列
然后就是跳的问题。模型貌似是置换的快速幂,不会
只会用倍增。空间开不下?滚动数组。
如果滚动数组倍增代码用for循环难理解,可以参考下面的一维版代码。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath> #define N 1000007
#define ll long long using namespace std;
ll n,m,k,ans,cnt,a[N],p[N];
int f[N][],g[N]; inline ll read()
{
ll x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int main()
{
n=read();k=read();m=read();
for(int i=;i<=n;i++) a[i]=read();
ll l=,r=k+,lim=log2(m)+;
for(int i=;i<=n;i++)
{
while(r<n && a[r+]-a[i]<a[i]-a[l]) l++,r++;
f[i][]=(a[r]-a[i]>a[i]-a[l]?r:l);
} if(m&) for(int i=;i<=n;i++) g[i]=f[i][];
else for(int i=;i<=n;i++) g[i]=i;
r=;p[]=;
for(int i=;i<=lim;i++) p[i]=p[i-]<<; for(int j=;j<=lim;j++)
{
for(int i=;i<=n;i++) f[i][r]=f[f[i][r^]][r^];
if(m&p[j]) for(int i=;i<=n;i++) g[i]=f[g[i]][r];
r^=;
}
for(int i=;i<=n;i++) printf("%d ",g[i]);printf("\n");
return ;
}
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm> #define ll long long
#define N 1000005 using namespace std;
int l,r;
ll n,k,m,a[N];
int f[N],tmp[N],g[N]; inline ll read()
{
ll x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int main()
{
n=read();k=read();m=read();
for(int i=;i<=n;i++) a[i]=read();
l=;r=k+;
f[]=a[]-a[l]>=a[r]-a[]?l:r;
for(int i=;i<=n;i++)
{
while(r<n&&a[i]-a[l]>a[r+]-a[i]) l++,r++;
f[i]=a[i]-a[l]>=a[r]-a[i]?l:r;
}
for(int i=;i<=n;i++) g[i]=i; while(m)
{
if (m&)
{
for(int i=;i<=n;i++) tmp[i]=f[g[i]];
for(int i=;i<=n;i++) g[i]=tmp[i];
}
for(int i=;i<=n;i++) tmp[i]=f[f[i]];
for(int i=;i<=n;i++) f[i]=tmp[i];
m>>=;
}
for(int i=;i<=n-;i++) printf("%d ",g[i]);
printf("%d\n",g[n]);
}
bzoj2093: [Poi2010]Frog(单调队列,倍增)的更多相关文章
- bzoj2096[Poi2010]Pilots 单调队列
2096: [Poi2010]Pilots Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 983 Solved: 513[Submit][Statu ...
- [POI2010]PIL-Pilots 单调队列
[POI2010]PIL-Pilots 题意: 给定一个序列和一个数值k,求一段连续最大区间是的最大值与最小值之差小于k: 思路: 因为要维护最大值和最小值并且连续,使用两个单调队列分别同时维护最大最 ...
- BZOJ 2096: [Poi2010]Pilots 单调队列
Code: #include<bits/stdc++.h> #define maxn 4000000 using namespace std; void setIO(string s) { ...
- BZOJ2093 : [Poi2010]Frog
从左往右维护两个指针l,r表示离i最近的k个点的区间,预处理出每个点出发的后继,然后倍增. #include<cstdio> typedef long long ll; const int ...
- 【BZOJ2096】[Poi2010]Pilots 双指针+单调队列
[BZOJ2096][Poi2010]Pilots Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串, ...
- 【单调队列】bzoj2096 [Poi2010]Pilots
用两个单调队列维护序列中的最大值和最小值即可. poi~ #include<cstdio> #include<algorithm> using namespace std; i ...
- BZOJ 2093: [Poi2010]Frog
Description 从一个点到达与他距离第 \(k\) 小的点,问从每个点跳 \(m\) 次到达那个点. Sol 队列+倍增. 保持队列里的元素个数为 \(k\) ,从前往后扫不难发现左右端点都是 ...
- BZOJ 2096([Poi2010]Pilots-单调队列-差值)
2096: [Poi2010]Pilots Time Limit: 30 Sec Memory Limit: 162 MB Submit: 190 Solved: 97 [ Submit][ ...
- bzoj1791: [Ioi2008]Island 岛屿 单调队列优化dp
1791: [Ioi2008]Island 岛屿 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1826 Solved: 405[Submit][S ...
随机推荐
- hihoCoder#1062 最近公共祖先·
原题地址 A和A的共同祖先是A,即使A没有在之前的家谱中出现过!被这个坑了,WA了很久... 比如:小头爸爸是大头儿子他爹,问:隔壁王叔叔和隔壁王叔叔的最近祖先是谁?,答:隔壁王叔叔. 代码: #in ...
- mysql pager用法&命令行命令
下面讲的命令,有部分只能在linux上才有.像pager命令windows上就没有了. 分屏:在Linux上,而且不是xwindow时,使用mysql命令行时,输出太多的东西,看不到就很悲剧了.在sh ...
- NIST的安全内容自动化协议(SCAP)以及SCAP中文社区简介
https://blog.csdn.net/langkew/article/details/8795530?utm_source=tuicool&utm_medium=referral
- 使用idea编译spring-framework5.0源码
自从迈入java开发这个行当,从来没有好好的研究过源码,深感惭愧,话不多说,今天上一篇使用idea编译spring5.0源码. 以下在win中构建和编译过程分为 jdk环境的配置 gradle的下载和 ...
- 利用Python爬虫实现百度网盘自动化添加资源
事情的起因是这样的,由于我想找几部经典电影欣赏欣赏,于是便向某老司机寻求资源(我备注了需要正规视频,绝对不是他想的那种资源),然后他丢给了我一个视频资源网站,说是比较有名的视频资源网站.我信以为真,便 ...
- cakephp2.3.8中何为component
大胆假设,小心求证 记得这句话是以前读高三的时候,一个数学老师(圆头,有点胖胖的老师,不是很记得),经常挂在嘴边的一句话, 对于我们不理解,或者说是无法确定的东西,我们不妨先大胆地去假 ...
- cocos2d-x 2.2.3 建project
2.2以后不再使用模板安装了. 打开终端,进入cocos2d-x文件夹下的tools/project-creator,运行命令 ./create_project.py -project [项目名] - ...
- linux 下查看一个进程执行路径
在linux下查看进程大家都会想到用 ps -ef|grep XXX 但是看到的不是全路径.怎么看全路径呢? 每一个进程启动之后在 /proc以下有一个于pid相应的路径 比如:ps -ef|grep ...
- struts2开发中一些概念的理解
对象关系映射(orm)中的两个概念 VO 和 PO: 它们都包含一些属性及这些属性的get/set方法 1.VO:是值对象,可以理解为业务对象,存活在业务层,供业务逻辑使用,当前业务逻辑需要一组什么数 ...
- 在64位的ubuntu 14.04 上开展32位Qt 程序开发环境配置(pro文件中增加 QMAKE_CXXFLAGS += -m32 命令)
为了能中一个系统上开发64或32位C++程序,费了些周折,现在终于能够开始干过了.在此记录此时针对Q5.4版本的32位开发环境配置过程. 1. 下载Qt 5.4 的32位版本,进行安装,安装过程中会发 ...