题目链接

从一个点只能往后跳,即后继状态只有一个,那么拿nxt[x]做fa[x]啊!这样就成了一棵树,从每个点开始的答案是它到所在树的根节点的距离。

nxt[]的更改即动态修改树边,用LCT即可。

这样查询需要的就是 Access(x),Splay(x);return sz[x];(sz[lson]+1一样...)

修改就将Cut(x,fa[x]),将x旋到根后砍掉左子树就行了。

因为不需要去查一条x->y的链,且保证是一棵树,所以Split,Make_root,PushDown...就可以省了。

  1. //6292kb 1292ms
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. #define gc() getchar()
  6. const int N=2e5+5;
  7. int n,A[N],nxt[N];
  8. inline int read()
  9. {
  10. int now=0;register char c=gc();
  11. for(;!isdigit(c);c=gc());
  12. for(;isdigit(c);now=now*10+c-'0',c=gc());
  13. return now;
  14. }
  15. namespace LCT
  16. {
  17. #define lson son[x][0]
  18. #define rson son[x][1]
  19. int fa[N],son[N][2],sz[N],sk[N];
  20. inline void Update(int x){
  21. sz[x]=sz[lson]+sz[rson]+1;
  22. }
  23. inline bool n_root(int x){
  24. return son[fa[x]][0]==x||son[fa[x]][1]==x;
  25. }
  26. void Rotate(int x)
  27. {
  28. int a=fa[x],b=fa[a],l=son[a][1]==x,r=l^1;
  29. if(n_root(a)) son[b][son[b][1]==a]=x;
  30. if(son[x][r]) fa[son[x][r]]=a;
  31. fa[a]=x, fa[x]=b;
  32. son[a][l]=son[x][r], son[x][r]=a;
  33. Update(a);//Update(x);
  34. }
  35. void Splay(int x)
  36. {
  37. int t=1,a=x,b; sk[1]=x;
  38. while(n_root(x))
  39. {
  40. a=fa[x], b=fa[a];
  41. if(n_root(a)) Rotate(son[a][1]==x^son[b][1]==a?x:a);
  42. Rotate(x);
  43. }
  44. Update(x);
  45. }
  46. void Access(int x){
  47. for(int pre=0; x; x=fa[pre=x])
  48. Splay(x), rson=pre, Update(x);
  49. }
  50. int Query(int x){
  51. Access(x),Splay(x); return sz[x];
  52. }
  53. void Modify(int x,int y){
  54. // Access(x), fa[x]=son[fa[x]][1]=0;//这样不对 x的左子树(可能有)还是连在fa[x]上的
  55. Access(x), Splay(x), lson=fa[lson]=0, Update(x);
  56. if(x+y<=n) fa[x]=x+y;
  57. }
  58. }
  59. int main()
  60. {
  61. n=read();
  62. for(int a,i=1; i<=n; ++i)
  63. {
  64. a=read(), LCT::sz[i]=1;
  65. if(i+a<=n) LCT::fa[i]=i+a;//不需要初始时都Link()起来,连轻边即可
  66. }
  67. int opt,x,y,m=read();
  68. while(m--)
  69. {
  70. opt=read(),x=read()+1;
  71. if(opt==1) printf("%d\n",LCT::Query(x));
  72. else y=read(), LCT::Modify(x,y);
  73. }
  74. return 0;
  75. }

BZOJ.2002.Bounce 弹飞绵羊(LCT)的更多相关文章

  1. bzoj 2002 Bounce 弹飞绵羊

    bzoj 2002 Bounce 弹飞绵羊 设一个虚拟节点表示被弹飞,则每个点的后继点是唯一确定的,每个点向它的后继点连边,就形成了一颗树. 询问就是问某个节点到虚拟节点的路径长度,修改就删除原来向后 ...

  2. BZOJ 2002 Bounce 弹飞绵羊 (分块或动态树)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 13768  Solved: 6989[Subm ...

  3. BZOJ 2002 Bounce 弹飞绵羊 —— 分块算法

    题目链接:https://vjudge.net/problem/HYSBZ-2002 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Li ...

  4. bzoj 2002 Bounce 弹飞绵羊(分块)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 11202  Solved: 5698[Subm ...

  5. [BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree)

    [BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree) 题面 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一 ...

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

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

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

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

  8. 【bzoj 2002】弹飞绵羊

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

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

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

随机推荐

  1. ioremap 与 mmap【转】

    转自:http://blog.csdn.net/junllee/article/details/7415732 内存映射 对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件 ...

  2. mysql binglog server的设置方法【原创】

    MySQL备份数据都是MySQL备份+binlog,这样才能保证数据的完整性.下面就是利用mysqlbinlog搭建mysql binlog server,可以把binlog传到远程存储上. 试验环境 ...

  3. Windows CreateFont:创建自己的字体

    原文地址:http://blog.csdn.net/softn/article/details/51718347 前面无论是使用文本输出函数还是 static 控件,字体都是默认的,比较丑陋,我们完全 ...

  4. select 不要 用*

    背景 说实在的,这有什么好记录的呢.记录这个有啥用,真是技术人员的吹毛求疵.说起来,就是给人装有用吧.既然记录了,也想个相关的段子吧.曾经有个同事写了个sql,效率极差,来了个女同事,竟然解决了,问题 ...

  5. 一台电脑,两个及多个git账号配置

    1. 生成两[三]个ssh公钥私钥 方法参照:http://www.cnblogs.com/fanbi/p/7772812.html第三步骤 假定其中一个是id_rsa, 另一个时id_rsa_two ...

  6. [学习笔记]Java代码中各种类型变量的内存分配机制

    程序运行时,我们最好对数据保存到什么地方做到心中有数.特别要注意的是内存的分配.有六个地方都可以保存数据: (1) 寄存器 这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部.然而 ...

  7. PYTHON-组合 封装 多态 property装饰器

    # 组合'''软件重用的重要方式除了继承之外还有另外一种方式,即:组合组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之 ...

  8. win7 X64系统上 PL/SQL不能识别Oracle实例

    电脑系统为Win7 64位,安装的PLSql为64位,安装的Oracle客户端为运行时类型的,应该为32位客户端 电脑上之前安装的32位toad可以识别Oracle实例 在系统添加了oracle_ho ...

  9. 【前端】三个bug

    目录 一.Array对象的indexOf() 二.使用jquery,clone()下拉框问题 三.jquery获取获取html5的data-*属性 一.Array对象的indexOf() 1.inde ...

  10. web中切图、快速切图与web雪碧图制作的方法

    声明: web小白的笔记,欢迎大神指点,联系QQ:1522025433. 工具:Photoshop 1.复制文字:点击文章工具后选择文字. 2.矩形选框工具 看信息 f8, 取消矩形选框 Ctrl+D ...