BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 lct 动态树 splay
http://www.lydsy.com/JudgeOnline/problem.php?id=2002
http://blog.csdn.net/frods/article/details/52244250
本来以为lct是很难的算法没想到这么简单。。。也可能只是这道题简单。
看上去挺暴力的算法却有着很优秀的复杂度,很美丽了orz。
做法就是每次查询把子节点连一条到根的通路,所有的儿子都在父亲右儿子上,再splay查询的点。此时查询的点的左儿子的size就是所求的距离。
这个算法太神奇了orz。明明感觉有些粗笨简单但是透出朴实而容易ac的美,就像约翰内斯·维米尔的画,QAQ太令人愉悦了,QAQ谁会不喜欢splay呢。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=;
int n,m;
int kid[maxn][]={},fa[maxn]={},siz[maxn]={};
inline bool CheckRoot(int x){return kid[fa[x]][]!=x&&kid[fa[x]][]!=x;}
inline void updata(int x){
siz[x]=+siz[kid[x][]]+siz[kid[x][]];
}
void rotate(int x){
int y=fa[x];int fy=fa[y];
int l,r;
l=kid[y][]==x?:; r=l^;
if(!CheckRoot(y)){
if(kid[fy][]==y)kid[fy][]=x;
else kid[fy][]=x;
}fa[x]=fy;
fa[y]=x;
fa[kid[x][r]]=y;
kid[y][l]=kid[x][r];kid[x][r]=y;
updata(y);//updata(x);这里不需要updata(x)因为splay只updata一下就可以惹
}
void Splay(int x){
while(!CheckRoot(x)){
int y=fa[x];int fy=fa[y];
if(!CheckRoot(y)){
if((x==kid[y][])^(y==kid[fy][]))rotate(x);
else rotate(y);
}rotate(x);
}updata(x);
}
void Access(int x){
int y=;
while(x){
Splay(x);kid[x][]=y;
updata(x);
y=x;x=fa[x];
}
}
void Cut(int x){
Access(x);Splay(x);
kid[x][]=fa[kid[x][]]=;
}
void Link(int x,int y){
Cut(x);
fa[x]=y;
updata(x);
}
int main(){
scanf("%d",&n);
int k,x,v;
for(int i=;i<=n;i++){
scanf("%d",&v);
fa[i]=i+v>n?:i+v;
siz[i]=;
}
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d%d",&k,&x);x++;
if(k==){
Access(x);
Splay(x);
printf("%d\n",siz[kid[x][]]+);
}
else{
scanf("%d",&v);
Link(x,x+v>n?:x+v);
}
}
return ;
}
BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 lct 动态树 splay的更多相关文章
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 (动态树LCT)
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2843 Solved: 1519[Submi ...
- BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊(动态树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2002 [题目大意] 给出一片森林,操作允许更改一个节点的父亲,查询一个节点的深度. [ ...
- 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 弹飞绵羊 (LCT维护深度)
要维护深度,就维护一下size就行了.access一下x,那么从根->x这一条链就独立成为一棵splay,那么splay的size节点数就是x的深度. 删边的时候直接access一下,splay ...
- bzoj 2002 : [Hnoi2010]Bounce 弹飞绵羊 (LCT)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 题面: 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 9071 Solved: 4652[Submi ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 分块
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 弹飞绵羊 【分块】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 ...
随机推荐
- JS模块规范
ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使 ...
- JSON数据填充表格——(三)
1.定义页面请求JSON的按钮与定义一个带表头的表格 请求数据的按钮 <button class="btn btn-primary search_bar_button floatR& ...
- numpy细碎知识点
np.random.rand() 基于python自带模块random的random函数的一个延伸吧,生成指定数量的列表 np.random.rand(a,b) 参数a,b均为整型,生成含有a个元素的 ...
- axios通过django的csrf验证
django会在浏览器的cookie里面保存一项csrftoken=GvzB3ilhlgadishmascacsilreclherlkjhaklsdv3qx4M96XRG88omScDPQaKoMxJ ...
- c++字节数组转换为整型
http://bbs.csdn.net/topics/360132089 BYTE data[4]={0x00,0x00,0xe6,0x00};//第一句UINT a11=*(UINT*)data;/ ...
- SHELL 中的变量
变量的分类 系统环境变量 系统本身所有,通常为大写字母 系统变量通过 set 或 declare 指令进行查看 UDV 变量(user defined variable ) 用户创建和维护,建议大写 ...
- UFLDL 教程学习笔记(四)
课程地址:http://ufldl.stanford.edu/tutorial/supervised/FeatureExtractionUsingConvolution/ 在之前的练习中,图片比较小, ...
- 本地删除文件,git远程不同步删除
git add -a 或 git add * 它能stages所有文件,包括之前删除的痕迹 git add . 只能stages新文件和被修改的文件,不会stages已被删除的文件 步骤如下: 1) ...
- MySQL学习笔记:少用Null
在实际编程中,Null容易引起很多问题,例如在Java里NullPointerException猝不及防的空指针异常,因此需要过多的if判断,甚是麻烦. 在MySQL数据库中也要少用Null,尽量保持 ...
- INNODB表快速迁移
本实验在一台server上启动了2个mysql实例端口分别是3307 3308,目的是将3307的表aaa迁移到3308中去,并打开3308的slave 1.在3308上 mysql> dr ...