[BZOJ2002][洛谷P3203][Hnoi2010]Bounce 弹飞绵羊(LCT维护链长)
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
1 2 1 1
3
1 1
2 1 1
1 1
Sample Output
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维护链长)的更多相关文章
- 洛谷 3203 HNOI2010 BOUNCE 弹飞绵羊
[题解] 这道题可以用Link-Cut Tree写.. 首先建立一个虚拟节点N+1,$i$与$N+1$连边表示$i$被弹飞了 对于修改操作,先$cut(i,min(n+1,i+k[i]))$,然后再$ ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 (LCT维护深度)
要维护深度,就维护一下size就行了.access一下x,那么从根->x这一条链就独立成为一棵splay,那么splay的size节点数就是x的深度. 删边的时候直接access一下,splay ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 LCT
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...
- [BZOJ2002] [Hnoi2010] Bounce 弹飞绵羊 (LCT)
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- [BZOJ2002][Hnoi2010]Bounce弹飞绵羊 LCT
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 建图,每次往后面跳就往目标位置连边,将跳出界的点设为同一个点.对于修改操作发现可以用 ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 lct 动态树 splay
http://www.lydsy.com/JudgeOnline/problem.php?id=2002 http://blog.csdn.net/frods/article/details/5224 ...
- luoguP3203 [HNOI2010]BOUNCE 弹飞绵羊
P3203 [HNOI2010]BOUNCE 弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonke ...
- AC日记——[HNOI2010]BOUNCE 弹飞绵羊 洛谷 P3203
[HNOI2010]BOUNCE 弹飞绵羊 思路: SBlct: 代码: #include <bits/stdc++.h> using namespace std; #define max ...
- 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 分块
[bzoj2002][Hnoi2010]Bounce 弹飞绵羊 2014年7月30日8101 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀 ...
随机推荐
- spark教程(12)-生态与原理
spark 是目前非常流行的大数据计算框架. spark 生态 Spark core:包含 spark 的基本功能,定义了 RDD 的 API,其他 spark 库都基于 RDD 和 spark co ...
- Ruby学习中(哈希变量/python的字典, 简单的类型转换)
一. 哈希变量(相当于Python中的字典) 详情参看:https://www.runoob.com/ruby/ruby-hash.html 1.值得注意的 (1). 创建Hash时需注意 # 创建一 ...
- Scala学习一——基础
一.使用Scala解释器 如果以命令行的方式运行,输出的结果会把类型带上,且结果名默认为res0递增.且Scala解释器读到一个解释器求值打印然后读取下一个(这个过程为读取-求值-打印-循环[REPL ...
- 关于Android studio调用高德地图的简单流程和要点
一,账号与Key的申请 注册成为高德开发者需要分三步: 第一步,注册高德开发者:第二步,去控制台创建应用:第三步,获取Key. 前2步都比较简单,这里说下第三步. 获取Key 1.进入控制台,创建一个 ...
- 07 Nginx负载均衡
1.负载均衡的实现. 1.准备三台虚拟机,比如 192.168.119.146 提供资源 192.168.119.147 提供nginx的负载均衡 192.168.119.148 提供资源 2.分别配 ...
- js动态添加行和列(table)
function AddTableRow() { var Table = document.getElementById("NewTable"); //取得自定义的表对象 NewR ...
- vue-复制功能插件-兼容性最好的插件
记录给自己用,不进同一次坑: https://github.com/Inndy/vue-clipboard2
- ES6基本常见语法
特色:写法更加优雅,更加像面像对象的编程,其思想和 ES5 是一致的. 箭头函数.this ES6中可以使用 => 作为函数表达形式,极简风格,参数+ => +函数体. var foo = ...
- PyTorch安装问题解决
现在caffe2被合并到了PyTorch中 git clone https://github.com/pytorch/pytorch pip install -r requirements.txtsu ...
- 实体类与数据库字段不匹配问题,java.sql.SQLSyntaxErrorException: Unknown column 'xxx' in 'field list'
控制台报错 ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column 'user_nam ...