luoguP3203 [HNOI2010]BOUNCE 弹飞绵羊
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的情况,你都要输出一个需要的步数,占一行。
输入输出样例
4
1 2 1 1
3
1 1
2 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 弹飞绵羊的更多相关文章
- [luoguP3203][HNOI2010]BOUNCE 弹飞绵羊(LCT)
传送门 每个点都会跳到另一个点,连边就是一棵树. 更改弹力就是换边. 求一个点跳多少次跳到终点就是求这个点的深度,那么只需要维护 size 域,access(n + 1) 然后 splay(x),求 ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 9071 Solved: 4652[Submi ...
- 【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]]即为答 ...
- 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 分块
[bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀 ...
- 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
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)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 题面: 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: ...
- 【BZOJ2002】 [Hnoi2010]Bounce 弹飞绵羊
BZOJ2002 [Hnoi2010]Bounce 弹飞绵羊 Solution 很早以前写的一道分块题,最近在搞LCT,又做了一遍. 1.LCT做法 看到这种动态修改,想下LCT怎么维护. 修改操作就 ...
随机推荐
- iframe高度/宽度自适应(使用body而不是docuemntElement对象)
iframe在ie11中会显示过于短.为了自适应,增加如下代码: <iframe *** onload='changeFrameHeight()' > <script> fun ...
- Sublime Text 3 注册激活码
Sublime Text 3 注册激活码 ----- BEGIN LICENSE ----- sgbteam Single User License EA7E-1153259 8891CBB9 F15 ...
- Eratosthenes筛法
复杂度为nlogn. 算法思想为:枚举1~sqrt(n),然后把每一个数的倍数都都打上不是素数的标记. 还要特别注意0,1不是素数,打标记枚举到i*k<=n. 代码如下 #include< ...
- 2019HDU多校赛第二场 H HDU 6598 Harmonious Army(最小割模型)
参考博客https://blog.csdn.net/u013534123/article/details/97142191 #include<bits/stdc++.h> using na ...
- Codeforces 1196E. Connected Component on a Chessboard
传送门 注意到棋盘可以看成无限大的,那么只要考虑如何构造一个尽可能合法的情况 不妨假设需要的白色格子比黑色格子少 那么容易发现最好的情况之一就是白色排一排然后中间黑的先连起来,剩下黑色的再全部填白色周 ...
- jQuery 遍历 - 后代
向下遍历 DOM 树 下面是两个用于向下遍历 DOM 树的 jQuery 方法: children() find() jQuery children() 方法 children() 方法返回被选元素的 ...
- Delphi 监视数据的值
- Darknet版YOLO安装与配置
Darknet配置和安装 1. 安装显卡驱动 首先查看一下自己的电脑需要怎样的驱动,我们可以先到 http://www.nvidia.com/Download/index.aspx 查询下我们需要的是 ...
- 自定义Java Validator
自定义Java Validator 在项目中,针对汉字的长度计算,数据库和java的计算方式不一致,需要重新处理下java 的 Validator,使其满足项目 建立自定义的 validator an ...
- 2019-2020-1 20199319《Linux内核原理与分析》第六周作业
系统调用的三层机制(下) 给MenuOS增加命令 首先进入LinuxKernel文件夹,删除menu目录,然后git clone克隆一个新版本的menu,新版本的menu中已经添加了time和time ...