luogu传送门

2002: [Hnoi2010]Bounce 弹飞绵羊

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 16082  Solved: 8241
[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

HINT

Source

Solution

  我们按1-n编号哈,不用题目中的从0开始编号,因为0这个节点在蒟蒻写的LCT里面比较暧昧(雾),用它我会很方。。。

  对于每个i如果k+k[i]<=n,那么视为存在边i->k+k[i],否则视为存在边i->虚拟节点n+1。然后你会发现每个节点有且仅有一条出边,O,你想到了什么?内向树!然而节点n+1并没有出边所以这是一棵普通的树(不然怎么用LCT呢)。

  然后对于查询x的答案就是x到n+1的链长,这个其实顺手就求出来了,只需要维护sz,然后split一下x和n+1,答案就是此时根的sz值减1。

  至于修改操作,就是cut一下再link一下嘛。

  还有就是,我再也不在BZOJ上随便用cout了,这常数也忒大了。。。

Code

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+;
inline int read(){
int x=,w=;char ch=;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<)+(x<<)+(ch^),ch=getchar();
return w?-x:x;
}
int sz[N],f[N],c[N][];
bool rv[N];
#define lc c[x][0]
#define rc c[x][1]
inline bool nrt(int x){return c[f[x]][]==x||c[f[x]][]==x;}
inline void pushup(int x){sz[x]=sz[lc]+sz[rc]+;}
inline void rev(int x){lc^=rc^=lc^=rc;rv[x]^=;}
inline void pushdown(int x){if(rv[x]) rev(lc),rev(rc),rv[x]=;}
inline int get(int x){return c[f[x]][]==x;}
inline void link(int x,int y,int d){c[x][d]=y,f[y]=x;}
void rotate(int x){
int y=f[x],z=f[y],d=get(x);
if(nrt(y)) c[z][get(y)]=x;f[x]=z;
link(y,c[x][d^],d);
link(x,y,d^);
pushup(y),pushup(x);
}
int st[N],tp;
void splay(int x){
int t=x;
st[tp=]=t;
while(nrt(t)) st[++tp]=t=f[t];
while(tp) pushdown(st[tp--]);
for(;nrt(x);rotate(x))
if(nrt(f[x])) get(x)^get(f[x])?rotate(x):rotate(f[x]);
}
void access(int x){
for(int y=;x;x=f[y=x])
splay(x),c[x][]=y,pushup(x);
}
void makert(int x){access(x),splay(x),rev(x);}
int findrt(int x){
access(x),splay(x);
while(lc) pushdown(x),x=lc;
splay(x);return x;
}
void link(int x,int y){
makert(x);if(findrt(y)^x) f[x]=y;
}
void cut(int x,int y){
makert(x);
if(findrt(y)==x&&f[y]==x&&!c[y][]) f[y]=c[x][]=,pushup(x);
}
void split(int x,int y){
makert(x),access(y),splay(y);
}
int n,m,k[N];
#define to(x) min(x+k[x],n+1)
int main(){
n=read();
for(int i=;i<=n;++i) k[i]=read(),link(i,to(i));
m=read();
while(m--){
int x=read(),y=read()+;
if(x&){
split(y,n+);
printf("%d\n",sz[n+]-);
}
else{
cut(y,to(y));
k[y]=read();
link(y,to(y));
}
}
return ;
}

BZOJ2002

  

[BZOJ2002][洛谷P3203][Hnoi2010]Bounce 弹飞绵羊(LCT维护链长)的更多相关文章

  1. 洛谷 3203 HNOI2010 BOUNCE 弹飞绵羊

    [题解] 这道题可以用Link-Cut Tree写.. 首先建立一个虚拟节点N+1,$i$与$N+1$连边表示$i$被弹飞了 对于修改操作,先$cut(i,min(n+1,i+k[i]))$,然后再$ ...

  2. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 (LCT维护深度)

    要维护深度,就维护一下size就行了.access一下x,那么从根->x这一条链就独立成为一棵splay,那么splay的size节点数就是x的深度. 删边的时候直接access一下,splay ...

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

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

  4. [BZOJ2002] [Hnoi2010] Bounce 弹飞绵羊 (LCT)

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

  5. [BZOJ2002][Hnoi2010]Bounce弹飞绵羊 LCT

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 建图,每次往后面跳就往目标位置连边,将跳出界的点设为同一个点.对于修改操作发现可以用 ...

  6. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 lct 动态树 splay

    http://www.lydsy.com/JudgeOnline/problem.php?id=2002 http://blog.csdn.net/frods/article/details/5224 ...

  7. luoguP3203 [HNOI2010]BOUNCE 弹飞绵羊

    P3203 [HNOI2010]BOUNCE 弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonke ...

  8. AC日记——[HNOI2010]BOUNCE 弹飞绵羊 洛谷 P3203

    [HNOI2010]BOUNCE 弹飞绵羊 思路: SBlct: 代码: #include <bits/stdc++.h> using namespace std; #define max ...

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

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

随机推荐

  1. 批量操作checkbox

    通过post可获取选中的checkbox的value值,然后可以action到某一页面通过$_POST[]处理得到的checkbox的值,然后进行批量化增删改查等操作. // 关键性语句: <i ...

  2. HTML5-placeholder属性

    HTML 5<input> placeholder属性 placeholder属性提供可描述输入字段预期值的提示信息(hint). 该提示会在输入字段为空时显示,并会在字段获得焦点时消失. ...

  3. svn add 忽略node_modules

    一劳永逸 这个窗口怎么打开 桌面右键,TortoiseSvn,然后点settings,加如下代码,要加空格 node_modules 参考: https://www.leixuesong.cn/336 ...

  4. 1.css选择器

    1.引入外部样式表的格式: <link rel=”stylesheet” type=”text/css” href=”../css/style1.css”> 2.样式表第一行应注明编码类型 ...

  5. python异步IO编程(二)

    python异步IO编程(二) 目录 开门见山 Async IO设计模式 事件循环 asyncio 中的其他顶层函数 开门见山 下面我们用两个简单的例子来让你对异步IO有所了解 import asyn ...

  6. python视频学习笔记5(高级变量的类型)

    知识点回顾: Python 中数据类型可以分为 **数字型** 和 **非数字型*** 数字型 * 整型 (`int`) * 浮点型(`float`) * 布尔型(`bool`) * 真 `True` ...

  7. mysql的导入导出操作

    mysqldump工具基本用法 此方法不适用于大数据备份 备份所有数据库 mysqldump -u root -p --all-databases > all_database_sql 备份my ...

  8. 安卓端调用h5界面js方法和ios端调用h5界面js方法

      备注:本人为h5开发人员,不懂安卓和ios,这是开发小伙伴对接联调的主代码. 1.iOS端调用h5界面js方法:     2.安卓端调用h5界面js方法: @Override    protect ...

  9. IIS 程序池优化配置方案

    内容目录 IIS 程序池优化配置方案IIS高并发配置一.IIS站点绑定程序池设置二.支持万级并发请求 IIS 程序池优化配置方案 最近由于系统的客户越来越多,有客户反映访问速度变慢,尤其是api的请求 ...

  10. JMeter元件之Test Fragment

    简介 JMeter中的Test Fragment,是控制器上一个种特殊的线程组,它在测试树上与线程组处于同一层级.但使用时需要和include Controller或者Module Controlle ...