任意门: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. PIXI 太空玉兔游戏(6)

    想法来源  出于练习看到这篇文章   没有什么难度  效果如下,接下来会用pixijs讲解如何实现 创建应用及舞台 HTML部分只创建标签引入 pixi.min.js  即可: <script ...

  2. method reference

    import java.util.Arrays; import java.util.List; import java.util.function.Function; import java.util ...

  3. Activemq API使用(整合spring)

    整合spring之后,主要用的就是org.springframework.jms.core.JmsTemplate的API了,在spring-jms-xxx.jar中. 引入整合需要的jar包: &l ...

  4. ajax请求方法及参数说明

    $.ajax()请求示例 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  5. c# 屏蔽快捷键

    前言 有时候开发会遇到这样一个需求,软件需要屏蔽用户的组合快捷键或某些按键,避免强制退出软件,防止勿操作等. 原理 1.要实现组合键,按键拦截,需要用到user32.dll中的SetWindowsHo ...

  6. xampp安装步骤及启动

    1  chmod 755 xampp-linux-*-installer.run 2 sudo ./xampp-linux-*-installer.run 启动停止 3 sudo /opt/lampp ...

  7. 【JAVA】重载和重写的区别

    重写(Overriding) 重写规则 1. 参数列表:必须与被重写方法的参数列表完全匹配.  2. 返回类型:必须与超类中被重写的方法中声明的返回类型或子类型完全相同  3. 访问级别:一定不能比被 ...

  8. TOJ 2749 Absent Substrings

    描述 Given a string of symbols, it’s natural to look it over and see what substrings are present. In t ...

  9. node.js之forEach

    forEach用法: var array1=[1,2,3]; array1.forEach(function(item,index){ console.log(item+'---'+index); } ...

  10. 04.Path类的学习

    path 是路径的意思. path类是一个静态类,所以path是一个工具类. Path类是专门用来操作路径的. Path的常用方法: namespace _15.Path类的学习 { class Pr ...