BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 【分块】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2002
2002: [Hnoi2010]Bounce 弹飞绵羊
Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 14824 Solved: 7515
[Submit][Status][Discuss]
Description
某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞。绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞。为了使得游戏更有趣,Lostmonkey可以修改某个弹力装置的弹力系数,任何时候弹力系数均为正整数。
Input
第一行包含一个整数n,表示地上有n个装置,装置的编号从0到n-1,接下来一行有n个正整数,依次为那n个装置的初始弹力系数。第三行有一个正整数m,接下来m行每行至少有两个数i、j,若i=1,你要输出从j出发被弹几次后被弹飞,若i=2则还会再输入一个正整数k,表示第j个弹力装置的系数被修改成k。对于20%的数据n,m<=10000,对于100%的数据n<=200000,m<=100000
Output
对于每个i=1的情况,你都要输出一个需要的步数,占一行。
Sample Input
1 2 1 1
3
1 1
2 1 1
1 1
Sample Output
3
题意概括:略
解题思路:
在线的查询,神奇暴力算法分块!
记录每个点跳到下一分块的步数和每个点跳到下一分块的位置
AC code:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#define ll long long int
#define INF 0x3f3f3f3f
using namespace std;
const int MAXN = 2e5+;
inline ll read()
{
ll x = , f = ; char ch = getchar();
while(ch > '' || ch < '') {if(ch == '-')f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x=x*+ch-''; ch = getchar();}
return x*f;
}
int N, M;
int block, cnt; ///分块的大小,分块的数量
int pt[MAXN], st[MAXN]; ///记录跳打下一个分块的位置 记录跳到下一个分块的步数
int K[MAXN];
int belong[MAXN]; ///记录当前的数属于第几个分块
int l[MAXN], r[MAXN]; ///记录每个分块的左右边界
inline int cal(int x)
{
int temp = ;
while(){
temp+=st[x];
if(!pt[x]) break; ///飞出去了
x = pt[x]; ///跳到下一个点
}
return temp;
}
int main()
{
N = read();
block = sqrt(N);
for(int i = ; i <= N; i++){
K[i] = read();
}
if(N%block) cnt = N/block+;
else cnt = N/block; for(int i = ; i <= cnt; i++){
l[i] = (i-)*block+; ///相当于退回前一个的右端点+1
r[i] = i*block;
}
r[cnt] = N; for(int i = ; i <= N; i++){
belong[i] = (i-)/block+;
} for(int i = N; i > ; i--){
if(i+K[i] > N) st[i] = ; ///飞出去了
else if(belong[i] == belong[i+K[i]]){ ///还没跳出当前分块
st[i] = st[i+K[i]]+; pt[i] = pt[i+K[i]];
}
else st[i] = , pt[i] = i+K[i]; ///跳到下一个分块
}
M = read();
int x, y, command;
for(int i = ; i <= M; i++){
command = read(), x = read();
x++;
if(command == ) printf("%d\n", cal(x));
else{
y = read();
K[x] = y;
for(int i = x; i >= l[belong[x]]; i--)
if(belong[i] == belong[i+K[i]]){ ///还没跳出当前分块
st[i] = st[i+K[i]]+; pt[i] = pt[i+K[i]];
}
else st[i] = , pt[i] = i+K[i]; ///跳到下一个分块
}
}
return ;
}
BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 【分块】的更多相关文章
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 分块
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...
- bzoj 2002 : [Hnoi2010]Bounce 弹飞绵羊 (LCT)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 题面: 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 9071 Solved: 4652[Submi ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 LCT
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...
- bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊 動態樹
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 4055 Solved: 2172[Submi ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 (动态树LCT)
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2843 Solved: 1519[Submi ...
- BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊:分块
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 题意: 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆 ...
- bzoj 2002[Hnoi2010]Bounce 弹飞绵羊(分治分块)
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- 洛谷 P3203 BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊
题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ...
随机推荐
- jsoup: Java HTML Parser
jsoup Java HTML Parser jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于j ...
- oracle 基础知识(十三)----执行计划
一, 执行计划是什么? 一条查询语句在ORACLE中的执行过程或访问路径的描述.即就是对一个查询任务,做出一份怎样去完成任务的详细方案. 二,执行计划的查看 设置autotrace 序号 命令 解释 ...
- Docker镜像命名解析
镜像是Docker最核心的技术之一,也是应用发布的标准格式. 无论你是用docker pull image,或者是在Dockerfile里面写FROM image, 从Docker官方Registry ...
- js模拟实现哈希表
在算法中,尤其是有关数组的算法中,哈希表的使用可以很好的解决问题,所以这篇文章会记录一些有关js实现哈希表并给出解决实际问题的例子. 说明: 这篇博客所写并不是真正意义的哈希表,只是与哈希表的使用有相 ...
- xampp安装步骤及启动
1 chmod 755 xampp-linux-*-installer.run 2 sudo ./xampp-linux-*-installer.run 启动停止 3 sudo /opt/lampp ...
- 《springcloud 四》服务保护机制
服务保护机制SpringCloud Hystrix 微服务高可用技术 大型复杂的分布式系统中,高可用相关的技术架构非常重要. 高可用架构非常重要的一个环节,就是如何将分布式系统中的各个服务打造成高可用 ...
- 121、Django rest framework入门使用
框架介绍 为你的django平台通过model生成对应的restfull api,并可以通过对应的http接口来进行 post .get.put.delete等操作.本文是也并非入门级别,不会带你去了 ...
- 操蛋的Django model------select_related() 主要用于一对一和一对多
实例: 创建表,表都是一对一,一对多 class Province(models.Model): name = models.CharField(max_length=10) class City(m ...
- 【Linux】快速清空当前文件
$ : > filename $ > filename $ echo "" > filename $ echo > filename $ cat /dev/ ...
- asp ajax
//[AjaxPro.AjaxMethod()] //public DataTable loadChecked() //{ // return BDAContext.GetObject<ICNP ...