任意门: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

4
1 2 1 1
3
1 1
2 1 1
1 1

Sample Output

2
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 弹飞绵羊 【分块】的更多相关文章

  1. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 分块

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...

  2. bzoj 2002 : [Hnoi2010]Bounce 弹飞绵羊 (LCT)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 题面: 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: ...

  3. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 9071  Solved: 4652[Submi ...

  4. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 LCT

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...

  5. bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊 動態樹

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 4055  Solved: 2172[Submi ...

  6. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 (动态树LCT)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2843  Solved: 1519[Submi ...

  7. BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊:分块

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 题意: 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆 ...

  8. bzoj 2002[Hnoi2010]Bounce 弹飞绵羊(分治分块)

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  9. 洛谷 P3203 BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊

    题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ...

随机推荐

  1. oracle12C--DG FAR SYNC 部署(前提为搭建好12C的DG)

    <<往期12CDG搭建>> 一,理解同步异步模式 01, 使用LGWR 进程的SYNC 方式 1)Primary Database 产生的Redo 日志要同时写到日志文件和网络 ...

  2. Windows x64位通过PEB获得Kernel32基地址

    在64位系统下 gs:[0x30] 指向TEB gs:[0x60] 指向PEB kd> dt _TEB nt!_TEB +0x000 NtTib : _NT_TIB +0x000 Excepti ...

  3. ubuntu中mysql5.7表名区分大小写解决方案

    在/etc/mysql/mysql.conf.d/mysqld.cnf 添加lower_case_table_names=1

  4. ssm(spring、springmvc、mybatis)框架整合

    第一次接触这3大框架,打算一个一个慢慢学,参照网上资料搭建了一个ssm项目,作为新手吃亏在jar包的导入上,比如jdbc DataSource配置的时候由于导入的jar包不兼容或者缺包导致项目无法正常 ...

  5. 04.Continue,和三元表达式的学习

    立即结束本次循环,判断循环条件,如果成立,则进入下一次循环,否则退出循环. 举例:运动员跑步喝水的例子 比如:我编写代码的时候,上个厕所,回来继续写代码 练习1: namespace _09.练习02 ...

  6. STL库中string类内存布局的探究

    在STL中有着一个类就是string类,他的内存布局和存储机制究竟是怎么样的呢? 这就是建立好的string 可以看出,图中用黄色框框标注的部分就是主要区域 我们用来给string对象进行初始化的字符 ...

  7. scss-#{}插值

    一般我们定义的变量都为属性值,可直接使用,但是如果变量作为属性或在某些特殊情况下则必须要以 #{$variables} 形式使用. 例如:scss代码 $borderDirection: top !d ...

  8. Celery-------周期任务

    在项目目录例子的基础上进行修改一下celery文件 from celery import Celery from celery.schedules import crontab celery_task ...

  9. Apache Flume

    An Event is a unit of data that flows through a Flume agent. The Event flows from Source to Channel  ...

  10. apk接入google play邮箱登陆及充值注意事项

    unity3d 接入google play商店相关sdk,相关要求A.环境配置: 1.手机安装谷歌安装器 2.使用谷歌安装器安装Google 服务框架.Google Play服务.Google Pla ...