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. c语音 dll断点调试方法

    转自:https://blog.csdn.net/qingzai_/article/details/45348613 dll调试方法: 1.把最新生成的dll和pdb放到 启动这个dll 的进程目录下 ...

  2. 【区间DP+好题】String painter

    https://www.bnuoj.com/v3/contest_show.php?cid=9149#problem/G [题意] 给定两个长度相同的字符串A,B.每次操作都能把A中的任意一个子段变成 ...

  3. java中使用Protobuf的实例(Demo)

    由于Protobuf受到推崇,故尝试采用protobuf来摒弃传统的xml进行传输数据. 首先,需要下载的关于Protobuf的文件: 1.到http://code.google.com/p/prot ...

  4. [NOIP2006] 提高组 洛谷P1066 2^k进制数

    题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后 ...

  5. Delphi:Indy9的IdFTP完全使用

    Delphi 7自带的INDY控件,其中包含了IdFTP,可以方便的实现FTP客户端程序,参考自带的例子,其中有上传.下载.删除文件,但是不包含对文件夹的操作,得自己实现上传.下载.删除整个文件夹(带 ...

  6. 洛谷—— P1690 贪婪的Copy

    https://www.luogu.org/problem/show?pid=1690 题目描述 Copy从卢牛那里听说在一片叫yz的神的领域埋藏着不少宝藏,于是Copy来到了这个被划分为个区域的神地 ...

  7. Spring Boot-Logback 配置(区分环境、分包、分级别打印)

    <?xml version="1.0" encoding="UTF-8"?> <configuration> <!--生产环境 - ...

  8. Builder设计模式

    Builder模式,又称生成器或构建者模式,属于对象创建型模式,侧重于一步一步的构建复杂对象,只有在构建完成后才会返回生成的对象.Builder模式将一个复杂对象的构建与它的表示分离,使得同样的构建过 ...

  9. 大话设计模式C++实现-第8章-工厂方法模式

    一.UML图 二.概念 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法是一个类的实例化延迟到其子类. 三.包括的角色 (1)抽象工厂 (2 ...

  10. JAVA OO之 类、对象、包

    类 类是具有相同属性和行为的一组对象的集合. public class HomeWork1 { public static void main(String[] args) { MyPhone mp= ...