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. WijmoJS 以声明方式添加 Vue 菜单项

    WijmoJS 以声明方式添加 Vue 菜单项 在V2019.0 Update2 的全新版本中,Vue框架下 WijmoJS 的前端UI组件功能得到再度增强. 如今,向wj菜单组件添加项的方法将不限于 ...

  2. linux 三剑客之awk总结

    AWK 1.begin end使用 cat /tmp/passwd |awk -F ':' 'BEGIN {print "hello"} {print $1"\t&quo ...

  3. excel批量修改文件名称

    步骤: 1. 然后将标准号所在的列复制三份到旁边相邻的空白列 2. 使用方方格子让三列中最左面的列只保存如下格式的数据: DB37/T或DB37/ 3. 使用方方格子让三列中中间的列的只保存如下格式的 ...

  4. sql server SQL 服务器 - RDBMS

    SQL 服务器 - RDBMS --现代的 SQL 服务器构建在 RDBMS 之上. DBMS - 数据库管理系统(Database Management System) --数据库管理系统是一种可以 ...

  5. java实现spark常用算子之map

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  6. 4种常用的Ajax请求方式

    在jQuery中,AJAX常见的请求方式主要有一下4种: 1.$.ajax()返回其创建的 XMLHttpRequest 对象 $.ajax() 只有一个参数:参数key/value对象,包含各配置及 ...

  7. 帝国cms 获取一条数据,但是从第二条开始获取

    /*这里的1指的是获取一条数据,2指的是从第二条开始获取*/ [e:loop={"select * from phome_ecms_news where classid='2' limit ...

  8. 解决:使用java连接Fastdfs,上传文件时报:SocketTimeOutException的问题

    最近研究了下分布式存储Fastdfs,在centOS上配置完后,使用centOS或putty连接并上传图片,然后用浏览器读取storage server返回的URL,一切正常. 但是,使用eclips ...

  9. 抗D十招:十个方法完美解决DDoS攻击防御难题

    可以说,DDoS是目前最凶猛.最难防御的网络攻击之一.现实情况是,这个世界级难题还没有完美的.彻底的解决办法,但采取适当的措施以降低攻击带来的影响.减少损失是十分必要的.将DDoS防御作为整体安全策略 ...

  10. WebAPI跨域问题处理

    1.按照https://dzone.com/articles/access-control-allow-origin-header-and-the-aspnet文章所述,在程序中配置允许跨域请求. 但 ...