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的更多相关文章

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

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

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

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2002 [题目大意] 给出一片森林,操作允许更改一个节点的父亲,查询一个节点的深度. [ ...

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

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

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

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

  5. bzoj 2002 : [Hnoi2010]Bounce 弹飞绵羊 (LCT)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 题面: 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: ...

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

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

  7. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 分块

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

  8. bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊 動態樹

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

  9. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 【分块】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 ...

随机推荐

  1. 基于Vue + Vuex + Vue-router + Webpack 2.0打造微信界面

    一.项目简介 基于Vue + Vuex + Vue-router + Webpack 2.0打造微信界面,实现了微信聊天.搜索.点赞.通讯录(快速导航).个人中心.模拟对话.朋友圈.设置等功能. 二. ...

  2. MySQL分布式集群之MyCAT(一)简介【转】

    隔了好久,才想起来更新博客,最近倒腾的数据库从Oracle换成了MySQL,研究了一段时间,感觉社区版的MySQL在各个方面都逊色于Oracle,Oracle真的好方便!好了,不废话,这次准备记录一些 ...

  3. MySQL 删除数据

    删除数据的语句有三种:DELETE.DROP.TRUNCATE. 1.DELETE语句 DELETE 语句用于删除表中的行. 语法 DELETE FROM 表名称 WHERE 列名称 = 值 例如 - ...

  4. SQLAlchemy-对象关系教程ORM-连接,子查询

    对象关系教程ORM-连接 一:内连接 方法一: for u, a in session.query(User, Address).\ filter(User.id==Address.user_id). ...

  5. Maven 基础知识

    Maven MavenMaven 简介 Maven MavenMaven 是 Apache Apache Apache 软件基金会组织维护的 软件基金会组织维护的 软件基金会组织维护的 软件基金会组织 ...

  6. 读书笔记--C陷阱与缺陷(六)

    第六章 1.预处理器:预处理器先对代码进行必要的转换处理,简化编程者的工作. 它的重要原因有以下两点: a. 假如要将程序中出现的所有实例都加以修改,但希望只改动程序一处数值,重新编译实现. 预处理器 ...

  7. SQL存储过程相关信息查看

    --1.查看所有存储过程与函数      exec sp_stored_procedures     或者      select * from dbo.sysobjects where OBJECT ...

  8. poj 2369(置换群)

    Permutations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3041   Accepted: 1641 Desc ...

  9. 聚类:(K-means)算法

    1.归类: 聚类(clustering) 属于非监督学习 (unsupervised learning) 无类别标记(class label) 2.举例: 3. K-means 算法:         ...

  10. RCTF2015 pwn试题分析

    pwn200 漏洞给的很明显,先是读到了main的局部数组中,然后在子函数中向子函数的局部数组栈里复制. 总体思路是leak system的地址,然后再向一个固定地址写入/bin/sh,最后执行sys ...