P3203 [HNOI2010]BOUNCE 弹飞绵羊

题目描述

某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞。绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞。为了使得游戏更有趣,Lostmonkey可以修改某个弹力装置的弹力系数,任何时候弹力系数均为正整数。

输入输出格式

输入格式:

第一行包含一个整数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

输出格式:

对于每个i=1的情况,你都要输出一个需要的步数,占一行。

输入输出样例

输入样例#1:

4
1 2 1 1
3
1 1
2 1 1
1 1
输出样例#1:

2
3

思路:

  分块什么的

坑点:

  1.注意是从0号元素开始!!!

  2.在luogu上最好不要用next数组...

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std; const int M = ;
const int N = ;
int n,m;
int k[M],steps[M],nxt[M];
///step数组存的是需要多少步跳出当前块
///next数组存的是跳到(下一块)的下一个点
int len,ks,kuai[M],l[N],r[N];///分块 void Builds()
{
///块的长度
len=sqrt(n);
///块的个数
ks=len;
if(n%ks) ks++;
///分块
for(int i=;i<n;i++)
kuai[i]=(i-)/len;
/*
因为块数是从0号开始计数的,
当i==(√n)时如果不进行-1,
会被分到第一块,
但事实上它是第0块的,
所以进行-1
*/
for(int i=;i<=ks;i++)
{
l[i]=(i-)*len;
///r[i]=i*len-1中-1的原因是:
///因为数组是从0号开始储存的
r[i]=i*len-;
}
///将最后一块的右端手动设置为n的长度
r[ks]=n;
for(int i=n-;i>=;i--)
{
int now=i+k[i];
///如果下一步跳到的地方已经跳出最远的距离n的话
if(now>=n)
///更新步数:跳一步就跳出去
steps[i]=,
///这里重要!需要手动将next数组设置一个不可能出现的数值
nxt[i]=-;
else
///假如在同一块中
if(kuai[i]==kuai[now])
///更新步数,i的步数由now的步数多跳一步来到当前(点)位置
steps[i]=steps[now]+,
///更新接下来跳到的点是...
nxt[i]=nxt[now];
else
///不在一块中
steps[i]=,
///跳到now这个点
nxt[i]=now;
}
} int ask(int pre)
{
int ans=;
while(pre!=-)
{
ans+=steps[pre];
pre=nxt[pre];
}
return ans;
} int main()
{
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%d",&k[i]);
///开始分块
Builds();
scanf("%d",&m);
for(int i=,c;i<m;i++)
{
scanf("%d",&c);
if(c==)
{
int pre;
scanf("%d",&pre);
printf("%d\n",ask(pre));
}
else
{
int pre,ki;
scanf("%d%d",&pre,&ki);
///更新k值
k[pre]=ki;
///因为更改k之后只会影响到当前块,并且只会影响他前面的
for(int j=pre;j>=l[kuai[pre]];j--)
{
int now=j+k[j];
if(now>=n)
steps[j]=,
nxt[j]=-;
else
if(kuai[j]==kuai[now])
steps[j]=steps[now]+,
nxt[j]=nxt[now];
else
steps[j]=,
nxt[j]=now;
}
}
}
return ;
}

luoguP3203 [HNOI2010]BOUNCE 弹飞绵羊的更多相关文章

  1. [luoguP3203][HNOI2010]BOUNCE 弹飞绵羊(LCT)

    传送门 每个点都会跳到另一个点,连边就是一棵树. 更改弹力就是换边. 求一个点跳多少次跳到终点就是求这个点的深度,那么只需要维护 size 域,access(n + 1) 然后 splay(x),求 ...

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

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

  3. 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 link-cut-tree

    2016-05-30 11:51:59 用一个next数组,记录点x的下一个点是哪个 查询时,moveroot(n+1),access(x),splay(x) ,输出size[ch[x][0]]即为答 ...

  4. 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 分块

    [bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀 ...

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

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

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

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

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

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

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

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

  9. 【BZOJ2002】 [Hnoi2010]Bounce 弹飞绵羊

    BZOJ2002 [Hnoi2010]Bounce 弹飞绵羊 Solution 很早以前写的一道分块题,最近在搞LCT,又做了一遍. 1.LCT做法 看到这种动态修改,想下LCT怎么维护. 修改操作就 ...

随机推荐

  1. 【转帖】Linux上,最常用的一批命令解析(10年精选)

    Linux上,最常用的一批命令解析(10年精选) https://juejin.im/post/5d134fbfe51d4510727c80d1 写的挺好呢 Linux这么多命令,通常会让初学者望而生 ...

  2. 小记----------lombok插件idea的安装&常见注解解释及小案例

    Lombok安装插件 软件:idea 2018.3.6版本 1.打开settings

  3. java-selenium浏览器常用操作命令

    一.浏览器操作命令 启动火狐浏览器(49版本以下) System.setProperty("webdriver.firefox.bin","D:\\Firefox\\fi ...

  4. MyBatis动态SQL第一篇之实现多条件查询(if、where、trim标签)

    一.动态SQL概述 以前在使用JDBC操作数据时,如果查询条件特别多,将条件串联成SQL字符串是一件痛苦的事情.通常的解决方法是写很多的if-else条件语句对字符串进行拼接,并确保不能忘了空格或在字 ...

  5. thinkphp6下无法获取header头中的Authorization(apache版)

    今天遇到在thinkphp框架中获取不到header头里边的 Authorization ,后来在.htaccess里面加多一项解决,记录下: <IfModule mod_rewrite.c&g ...

  6. Spring的AOP,Struts2的拦截器(Interceptor),以及springMVC的(interceptor)

    参考外链:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilter/ 1.首先,spring的AOP作用范围很广,可以使用Aspec ...

  7. python 高级函数

    高级函数 map 格式:map(func, lt) 说明:接受两个参数,一个函数和一个可迭代对象,返回一个生成器,将func依次作用于lt 示例: l = [1,2,3,4,5]​def double ...

  8. java复制文件范例代码

    String url1 = "F:\\SuperMap-Projects\\region.udb";// 源文件路径 try { for(int i=1;i<101;i++) ...

  9. oracle数据泵expdp和impdp使用

    expdp和impdp优缺点 优点: expdp/impdp命令,我们也通常称之为“数据泵(DataPump)”,它具有以下优点: l 在性能上,具有并行处理能力,因此可以获得性能上的优势,加快导入导 ...

  10. isAssignable

    import java.util.HashMap; import java.util.Map; public class MapTest { public static void main(Strin ...