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的情况,你都要输出一个需要的步数,占一行。

用块状树维护由跳跃一次后位置到跳跃前位置连边构成的有根树。

每操作O(n0.5)次重构整棵树

均摊时间复杂度O(n1.5)

#include<cstdio>
#include<cmath>
int n,m,rt;
int cs,cb,tt=,cb2;
int fa[],fw[],v[],dep[],top[];
int enx[],epv[],ew[],ep;
inline int min(int a,int b){
return a<b?a:b;
}
void addedge(int a,int b){
fa[b]=a;
ew[ep]=b;
enx[epv[ep]=epv[a]]=ep;
enx[ep]=a;
fw[b]=epv[a]=ep++;
}
void deledge(int a){
int x=fw[a],pv=epv[x];
epv[enx[pv]=enx[x]]=pv;
}
int getdep(int x){
int ans=-;
while(x){
ans+=dep[x];
x=fa[top[x]];
}
return ans;
}
void build(int w){
++cs;
if(cs<=cb)top[w]=top[fa[w]],dep[w]=dep[fa[w]]+;
else cs=,top[w]=w,dep[w]=;
for(int i=enx[w],u=ew[i];u=ew[i];i=enx[i])build(u);
}
int tp,tpn,dp;
void dfs(int w){
if(top[w]!=tp)return;
top[w]=tpn;
dep[w]=dp;
++dp;
for(int i=enx[w],u=ew[i];u=ew[i];i=enx[i])dfs(u);
--dp;
}
int main(){
scanf("%d",&n);
cb=sqrt(n);
cb2=cb*;
rt=n+;
for(int i=;i<=n;i++)scanf("%d",v+i);
for(int i=;i<=rt;i++)enx[i]=epv[i]=i;ep=rt+;
for(int i=;i<=n;i++)addedge(min(i+v[i],rt),i);
scanf("%d",&m);
cs=cb,build(rt);
while(m--){
int op,a,b;
scanf("%d",&op);
if(op==){
scanf("%d%d",&a,&b);++a;
v[a]=b;
deledge(a);
addedge(min(a+v[a],rt),a);
tp=top[a],tpn=a,dp=,dfs(a);
if(++tt>cb2)cs=cb,build(rt),tt=;
}else{
int vans;
scanf("%d",&a);++a;
printf("%d\n",vans=getdep(a));
}
}
return ;
}

bzoj2002 弹飞绵羊的更多相关文章

  1. BZOJ-2002 弹飞绵羊 Link-Cut-Tree (分块)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 6801 Solved: 3573 [Submi ...

  2. [Link-Cut-Tree][BZOJ2002]弹飞绵羊

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

  3. bzoj2002 弹飞绵羊 lct版

    这道题就是维护一个有根的lct 一开始建树全部建虚边 求多少次弹出就是求他到根的距离(根为n+1) 这里有个小技巧 将n+1作为根而没有虚根操作起来会比较方便 #include<cstdio&g ...

  4. BZOJ2002弹飞绵羊

    动态树LCT模板题 #include<cstdio> #include<cctype> #include<algorithm> using namespace st ...

  5. bzoj2002 弹飞绵羊 分块

    这道题是分块的初尝试 讲给定的区间n进行分块处理 这个每次修改的复杂的只有logn 很方便 代码是学黄学长的 http://hzwer.com/3505.html 当然里面还是有一定我自己的想法在里面 ...

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

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

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

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

  8. 【BZOJ2002】弹飞绵羊(Link-Cut Tree)

    [BZOJ2002]弹飞绵羊(Link-Cut Tree) 题面 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lost ...

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

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

随机推荐

  1. hdu2665

    题解: 裸的主席树,记录最小值 代码: #include<cstdio> #include<cmath> #include<algorithm> #include& ...

  2. Python 数据类型--Bytes类型

    一.Bytes类型 在Python3以后,字符串和bytes类型彻底分开了.字符串是以字符为单位进行处理的,bytes类型是以字节为单位处理的. bytes数据类型在所有的操作和使用甚至内置方法上和字 ...

  3. Pycharm(五)安装库和虚拟环境

    随便进入一个项目 进入设置    Ctrl + alt + S Project *********  - Project Interpreter     ******是你的项目名字 Project I ...

  4. 字符串 date 转标准 yyyyMMdd 格式

    学习转换成数字相加的思想 public static int ToDateInt(string dateStr)        {            if (string.IsNullOrEmpt ...

  5. 微信分享自定义标题和图片的js

    <script> document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() { window.sh ...

  6. static 关键字介绍

    大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 static 大显身手的时候了!! Java 中 ...

  7. C++中的接口继承和实现继承

    很多人认为,C++中是不存在接口继承的,只有Java.C#这类语言才提供了相应的语法支持. 但是,如同鲁迅说过的某句名言:世上本没有接口继承,用的人多了,才有了接口继承.C++中依然可以实现接口继承, ...

  8. 用UILabel实现文字滚动播放(跑马灯)效果

    - (void)viewDidLoad { [super viewDidLoad]; //数据源 self.messageArray = [NSArray arrayWithObjects: &quo ...

  9. layer弹出相册层

    如果想要制作一个简单的相册,可以采用这个插件的方法.如果你的图片是从后台传过来的json格式里,可以通过ajax加载让图片显示在页面上,然后在使用layer插件,做出点击以后就可以查看大图的效果. 一 ...

  10. 网页瀑布流布局插件Masonry

    CSS3有实现类似瀑布流布局的属性column,但是遗憾的是这种布局是纵向布局而不支持横向布局.所以比较合适用于文字多列布局. 调用JQuery WaterFall布局插件:http://masonr ...