洛谷P3509 Frog
2024-10-20 03:38:08
题目
首先分析数据范围发现m很大,所以线性做法肯定不行,因此考虑倍增,即预处理出每个点跳1次后的位置。然后只用两个数组类似于快速幂,推出每个点跳m次后的位置。
预处理离每个点第k小的点,可以用长度为k的尺子尺取。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define int long long
#define N 1001011
using namespace std;
int n, k, m;
int data[N], jum[N], ans[N], temp[N];
inline void init()
{
scanf("%lld%lld%lld", &n, &k, &m);
for (int i = 1; i <= n; i++)
scanf("%lld", &data[i]), ans[i] = i;
jum[1] = k + 1;
int l = 1, r = k + 1;
for (int i = 2; i <= n; i++)
{
while (r + 1 <= n && (data[r + 1] - data[i]) < (data[i] - data[l]) ) l++, r++;
if (data[r] - data[i] > data[i] - data[l])
jum[i] = r;
else
jum[i] = l;
}
}
signed main()
{
init();
while (m)
{
if (m & 1)
for (int i = 1; i <= n; i++)
ans[i] = jum[ans[i]];
m >>= 1;
for (int i = 1; i <= n; i++)
temp[i] = jum[i];
for (int i = 1; i <= n; i++)
jum[i] = temp[temp[i]];
}
for (int i = 1; i <= n; i++)
printf("%d ", ans[i]);
return 0;
}
最新文章
- 解除svn版本控制
- 从键盘上输入一个正整数n,请按照以下五行杨辉三角形的显示方式, 输出杨辉三角形的前n行。请采用循环控制语句来实现。
- 解决eclipse中egit中的cannot open git-upload-pack问题
- PLS-00221: &#39;function&#39; 不是过程或尚未定义
- oracle数据库什么情况下创建索引比较好
- Target Operator ID has No Access to Upgrade
- Python内置数据类型之Tuple篇
- 新霸哥带你进入java的世界
- Mongo客户端MongoVUE的基本使用
- jquery登录验证插件
- UVa1339 Ancient Cipher
- Scala入门系列(十):函数式编程之集合操作
- tar: This does not look like a tar archive tar: Skipping to next header tar: Exiting with failure status due to previous errors
- IP地址、端口、TCP协议、UDP协议
- 洛谷P1605走迷宫
- Golang福利爬虫
- 浅析Session和Cookie
- FMDB基本操作
- 安装及使用Eclipse Maven插件的经验
- ZJOI2018外省选手酱油记Day1