裸的LCT,关键是要怎么连边,怎么将这种弹飞关系转化成连边就行了。

那么我们可以这样连边:

  • 一个节点i的爸爸就是i+ki。

  • 没有i+ki那么就被弹飞了,即\(i\)的爸爸是虚拟节点n+1。

那么怎么求次数呢?

  • i的深度就是次数

对于求深度,我们可以先将x弄成root,然后通过Access(n+1)n+1号节点和x节点丢到一个Splay里面,维护一个size,每次询问的answer就是已经Splay到根的n+1号节点的size了。

Code:

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define inf 0x3f3f3f3f
  4. #define RI register int
  5. using namespace std;
  6. const int N=2e5+2;
  7. template <typename Tp> inline void IN(Tp &x){
  8. int f=1;x=0;char ch=getchar();
  9. while(ch<'0'||ch>'9')if(ch=='-')f=-1,ch=getchar();
  10. while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();x*=f;
  11. }int f[N],s[N],r[N],val[N],hep[N],ch[N][2];
  12. inline int get(int x){return ch[f[x]][0]==x||ch[f[x]][1]==x;}
  13. inline void pushup(int x){s[x]=s[ch[x][0]]+s[ch[x][1]]+1;}
  14. inline void pushdown(int x){
  15. if(!r[x])return;r[x]=0;
  16. swap(ch[x][0],ch[x][1]);
  17. if(ch[x][0])r[ch[x][0]]^=1;
  18. if(ch[x][1])r[ch[x][1]]^=1;
  19. }
  20. inline void rotate(int x){
  21. int y=f[x],z=f[y],k=ch[y][1]==x,v=ch[x][!k];
  22. if(get(y))ch[z][ch[z][1]==y]=x;ch[x][!k]=y,ch[y][k]=v;
  23. if(v)f[v]=y;f[y]=x,f[x]=z;pushup(y),pushup(x);
  24. }
  25. inline void Splay(int x){
  26. int y=x,top=0;hep[++top]=y;
  27. while(get(y))hep[++top]=y=f[y];
  28. while(top)pushdown(hep[top--]);
  29. while(get(x)){
  30. y=f[x],top=f[y];
  31. if(get(y))
  32. rotate((ch[y][0]==x)^(ch[top][0]==y)?x:y);
  33. rotate(x);
  34. }pushup(x);return;
  35. }
  36. inline void Access(int x){
  37. for(register int y=0;x;x=f[y=x])
  38. Splay(x),ch[x][1]=y,pushup(x);
  39. }
  40. inline int findroot(int x){
  41. Access(x);Splay(x);
  42. while(ch[x][0])pushdown(x),x=ch[x][0];
  43. return x;
  44. }
  45. inline void makeroot(int x){Access(x);Splay(x);r[x]^=1;}
  46. inline void split(int x,int y){makeroot(x);Access(y);Splay(y);}
  47. inline void link(int x,int y){makeroot(x);if(findroot(y)!=x)f[x]=y;}
  48. inline void cut(int x,int y){
  49. split(x,y);if(findroot(y)==x&&f[x]==y&&!ch[x][1])
  50. {f[x]=ch[y][0]=0;pushup(y);}return;
  51. }int n,m;
  52. int main(){
  53. scanf("%d",&n);
  54. for(register int i=1;i<=n+1;++i)s[i]=1;
  55. for(register int x,i=1;i<=n;++i){
  56. scanf("%d",&x);val[i]=x;
  57. link(i,(i+x<=n)?i+x:n+1);
  58. }scanf("%d",&m);
  59. for(register int op,x,y,i=1;i<=m;++i){
  60. scanf("%d%d",&op,&x);++x;
  61. if(op==1){
  62. makeroot(x);Access(n+1);Splay(n+1);
  63. printf("%d\n",s[n+1]-1);
  64. }else if(op==2){
  65. scanf("%d\n",&y);
  66. cut(x,(x+val[x]<=n)?x+val[x]:n+1);
  67. link(x,(x+y<=n)?x+y:n+1);val[x]=y;
  68. }
  69. }return 0;
  70. }

所以就没了。

题解 洛谷P3203/BZOJ2002【[HNOI2010]弹飞绵羊】的更多相关文章

  1. 【洛谷 P3203】 [HNOI2010]弹飞绵羊(LCT)

    题目链接 把每个点和能跳到的点连边,于是就构成了一个森林. 查询操作就是该点到根的路径长度,修改操作就相当于删边再重新连边. 显然是\(LCT\)的强项. 查询时\(access(x),splay(x ...

  2. 「洛谷P3202」[HNOI2010]弹飞绵羊 解题报告

    P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ...

  3. BZOJ2002[Hnoi2010]弹飞绵羊——LCT

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

  4. BZOJ2002 [HNOI2010] 弹飞绵羊

    LCT access完了一定splay再用!!! 悲伤= = LCT裸题 把调出去设虚点n+1即可 //Love and Freedom. #include<cstdio> #includ ...

  5. 洛谷 P3203 [HNOI2010]弹飞绵羊 解题报告

    P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ...

  6. [Luogu P3203] [HNOI2010]弹飞绵羊 (LCT维护链的长度)

    题面 传送门:洛谷 Solution 这题其实是有类似模型的. 我们先考虑不修改怎么写.考虑这样做:每个点向它跳到的点连一条边,最后肯定会连成一颗以n+1为根的树(我们拿n+1代表被弹出去了).题目所 ...

  7. P3203 [HNOI2010]弹飞绵羊(LCT)

    P3203 [HNOI2010]弹飞绵羊 LCT板子 用一个$p[i]$数组维护每个点指向的下个点. 每次修改时cut*1+link*1就解决了 被弹出界时新设一个点,权为0,作为终点表示出界点.其他 ...

  8. 【BZOJ2002】弹飞绵羊(Link-Cut Tree)

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

  9. [HNOI2010] 弹飞绵羊 (分块)

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

随机推荐

  1. (四)Java 基础语法

    Java 基础语法 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一 ...

  2. Spring中定时器实现

    在Spring 中使用Quartz,本文介绍Spring3.0以后自主开发的定时任务工具,spring task,可以将它比作一个轻量级的Quartz,而且使用起来很简单,除spring相关的包外不需 ...

  3. 洛谷 P1181,1182 数列分段Section

    数列分段Section I 题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格 ...

  4. 响应在此上下文中不可用 asp.net

    (一)实例1: 在asp.net程序中添加了一个 类.cs 如下 using System; using System.Collections; using System.ComponentModel ...

  5. Java多线程系列五——列表类

    参考资料: http://xxgblog.com/2016/04/02/traverse-list-thread-safe/ 一些列表类及其特性  类 线程安全 Iterator 特性 说明 Vect ...

  6. Newtonsoft.Json序列化日期时间去T的几种方式。

    原文地址:MVC web api 返回JSON的几种方式,Newtonsoft.Json序列化日期时间去T的几种方式. http://www.cnblogs.com/wuball/p/4231343. ...

  7. MySql数据库创建表

    3.3.MySql数据库创建表 创建5个表: UserInfo用户基础表 Role 角色表 MenuInfo 菜单即控制表 Relation_Role_Menu 角色对应菜单关系表 RelaTion_ ...

  8. 题解报告:poj 1094 Sorting It All Out(拓扑排序)

    Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...

  9. Windows环境下使用Netsh命令快速切换IP配置

    不同的内网环境需要使用不同的IP配置,频繁切换令人发狂,因此搜索了快速切换IP配置的方法. Netsh interface IP Set address "以太网" Static ...

  10. 402 Remove K Digits 移掉K位数字

    给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小.注意:    num 的长度小于 10002 且 ≥ k.    num 不会包含任何前导零.示例 1 :输入: ...