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

5 2 4
1 2 4 7 10

Sample Output

1 1 3 1 1
 
/*
如何求处离当前点第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(单调队列,倍增)的更多相关文章

  1. bzoj2096[Poi2010]Pilots 单调队列

    2096: [Poi2010]Pilots Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 983  Solved: 513[Submit][Statu ...

  2. [POI2010]PIL-Pilots 单调队列

    [POI2010]PIL-Pilots 题意: 给定一个序列和一个数值k,求一段连续最大区间是的最大值与最小值之差小于k: 思路: 因为要维护最大值和最小值并且连续,使用两个单调队列分别同时维护最大最 ...

  3. BZOJ 2096: [Poi2010]Pilots 单调队列

    Code: #include<bits/stdc++.h> #define maxn 4000000 using namespace std; void setIO(string s) { ...

  4. BZOJ2093 : [Poi2010]Frog

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

  5. 【BZOJ2096】[Poi2010]Pilots 双指针+单调队列

    [BZOJ2096][Poi2010]Pilots Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串, ...

  6. 【单调队列】bzoj2096 [Poi2010]Pilots

    用两个单调队列维护序列中的最大值和最小值即可. poi~ #include<cstdio> #include<algorithm> using namespace std; i ...

  7. BZOJ 2093: [Poi2010]Frog

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

  8. BZOJ 2096([Poi2010]Pilots-单调队列-差值)

    2096: [Poi2010]Pilots Time Limit: 30 Sec   Memory Limit: 162 MB Submit: 190   Solved: 97 [ Submit][ ...

  9. bzoj1791: [Ioi2008]Island 岛屿 单调队列优化dp

    1791: [Ioi2008]Island 岛屿 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1826  Solved: 405[Submit][S ...

随机推荐

  1. Linux下汇编语言学习笔记33 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  2. linux 常见名词及命令(五)

    计划任务服务之一次性任务: at <时间> 安排一次性任务 atq 或at -l 查看任务列表 at -c 序号 预览任务与设置环境 atrm 序号 删除任务 安排任务示例: 在23:30 ...

  3. POJ 1064_Cable master

    题意: 给定一系列长度的电缆,将他们切成K条相等长度的电缆,问每条最长有多长? 分析: 对长度进行二分,判断能否满足K条. 二分搜索: 在求解最大化或最小化问题中,能够比较简单的判断条件是否满足,那么 ...

  4. [bzoj1692][Usaco2007 Dec]队列变换_后缀数组_贪心

    队列变换 bzoj-1692 Usaco-2007 Dec 题目大意:给定一个长度为$n$的字符串.每次从头或尾取出一个字符加到另一个字符串里.要求变换后生成的字符串字典序最小,求字典序最小的字符串. ...

  5. Django学习系列之captcha 验证码插件

    安装部署 安装captcha pip3. install django-simple-captcha== settings.py中引入captcha INSTALLED_APPS = [ 'djang ...

  6. clamav完整查杀linux病毒实战(摘抄)

    http://dadloveu.blog.51cto.com/blog/715500/1882521 Linux服务器一直给我们的印象是安全.稳定.可靠,性能卓越.由于一来Linux本身的安全机制,L ...

  7. Centos samba install

    Ready Change Root Password passwd root 在提示下建立新密码 静态IP vi /etc/sysconfig/network-scripts/ifcfg-eth0  ...

  8. Kafka跨集群同步工具——MirrorMaker

    MirrorMaker是为解决Kafka跨集群同步.创建镜像集群而存在的.下图展示了其工作原理.该工具消费源集群消息然后将数据又一次推送到目标集群. watermark/2/text/aHR0cDov ...

  9. leetcode02-Add Two Numbers之beats98.68%Java版本号

    我的leetcode之旅,该篇章主要完毕使用Java实现算法. 这是第二篇Add Two Numbers 所有代码下载: Github链接:github链接,点击惊喜; 写文章不易.欢迎大家採我的文章 ...

  10. 使用requireJS的shim參数,完毕jquery插件的载入

    没有requireJS框架之前,假设我们想使用jquery框架,会在HTML页面中通过<script>标签载入.这个时候jquery框架生成全局变量$和jQuery等全局变量.假设项目中引 ...