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. C# 图片和Base64之间的转换

    public static Bitmap GetImageFromBase64String(string strBase) { try { MemoryStream stream = new Memo ...

  2. 信息安全学习笔记--XSS

    一.XSS简介 XSS (Cross Site Scripting)是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代 ...

  3. 2016.6.17——Valid Parentheses

    Valid Parentheses 本题收获: 1.stack的使用 2.string和char的区别 题目: Given a string containing just the character ...

  4. java7与java8中计算两个日期间隔多少年多少月多少天的实现方式

    最近工作中碰到个新需求,计算每个员工入职公司的时长,要求形式为多少年多少月多少天形式,某个值为0就跳过不显示,因为前段时间学习过java8新特性,对于这个需求,java8的新时间日期API可以直接解决 ...

  5. python学习之argparse模块的使用

    以下内容主要来自:http://wiki.jikexueyuan.com/project/explore-python/Standard-Modules/argparse.html argparse ...

  6. 【黑客免杀攻防】读书笔记17 - Rootkit基础

    1.构建Rootkit基础环境 1.1.构建开发环境 VS2012+WDK8 1.2.构建基于VS2012的调试环境 将目标机.调试机配置在同一个工作组内 sVS2012配置->DRIVER-& ...

  7. MySQL 修改数据

    UPDATE 语句 修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作. 可以同时修改 一个 或 多个 字段: 可以在where子句中指定条件: 可以在一个单独表中更新数 ...

  8. 用monit监控系统关键进程

    原地址: https://feilong.me/2011/02/monitor-core-processes-with-monit monit是一款功能强大的系统状态.进程.文件.目录和设备的监控软件 ...

  9. css-css背景

    CSS 允许应用纯色作为背景,也允许使用背景图像创建相当复杂的效果 一:背景色background-color 属性 p {background-color: gray;} 二:背景图像 backgr ...

  10. python基础--shutil模块

    shutil模块提供了大量的文件的高级操作. 特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作.对单个文件的操作也可参见os模块. 注意 即便是更高级别的文件复制函数(shutil.cop ...