题意:给定一棵树,要求维护以下操作:

1.删除连接(x,y)的边

2.将(x,y)之间连边

3.询问某点子树大小

对于100%的数据n<=200000,m<=100000

思路:第一道有加边删边的LCT

讲一下自己对LCT各个操作的理解

Access:最基本的操作,将一个点到LCT的根的点全部修改为重(实)边

可以理解为“全选操作”,配合Splay操作可以取出某段区间的信息

Splay:将X旋转到它所在链的顶部,这样就相当于将这条链中的信息集中到了X这个点上

LCT的splay要用栈pushdown维护的原因是普通splay中splay操作前这些信息已经在Findkth的时候下传

而LCT没有,需要手动下传

Findroot:找到LCT的根,先Access+splay,因为LCT是按照深度维护的,所以一直往左走,找到深度最小的就是根

Makeroot:将X设置为LCT的根,Access+splay,因为上下翻转了所以要打翻转标记

Link:链接两个不在同一条链上的点,Makeroot(x),fa[x]=y

split:取出(x,y)这段区间的信息,Makeroot(x),Access(y),splay(y),信息在y点上

此题输出左儿子的子树大小即可

  1. var t:array[..,..]of longint;
  2. next,fa,rev,size,q:array[..]of longint;
  3. n,m,i,x,y,tmp,top:longint;
  4.  
  5. function isroot(x:longint):boolean;
  6. begin
  7. if (t[fa[x],]<>x)and(t[fa[x],]<>x) then exit(true);
  8. exit(false);
  9. end;
  10.  
  11. procedure swap(var x,y:longint);
  12. var t:longint;
  13. begin
  14. t:=x; x:=y; y:=t;
  15. end;
  16.  
  17. procedure pushup(x:longint);
  18. var l,r:longint;
  19. begin
  20. l:=t[x,]; r:=t[x,];
  21. size[x]:=size[l]+size[r]+;
  22. end;
  23.  
  24. procedure pushdown(x:longint);
  25. var l,r:longint;
  26. begin
  27. l:=t[x,]; r:=t[x,];
  28. if rev[x]> then
  29. begin
  30. rev[x]:=rev[x] xor ; rev[l]:=rev[l] xor ; rev[r]:=rev[r] xor ;
  31. swap(t[x,],t[x,]);
  32. end;
  33. end;
  34.  
  35. procedure rotate(x:longint);
  36. var y,z,l,r:longint;
  37. begin
  38. y:=fa[x]; z:=fa[y];
  39. if t[y,]=x then l:=
  40. else l:=;
  41. r:=l xor ;
  42. while not isroot(y) do
  43. begin
  44. if t[z,]=y then t[z,]:=x
  45. else t[z,]:=x;
  46. end;
  47. fa[x]:=z; fa[y]:=x; fa[t[x,r]]:=y;
  48. t[y,l]:=t[x,r]; t[x,r]:=y;
  49. pushup(y);
  50. pushup(x);
  51. end;
  52.  
  53. procedure splay(x:longint);
  54. var y,z,k:longint;
  55. begin
  56. inc(top); q[top]:=x;
  57. k:=x;
  58. while not isroot(k) do
  59. begin
  60. inc(top); q[top]:=fa[k];
  61. k:=fa[k];
  62. end;
  63. while top> do
  64. begin
  65. pushdown(q[top]);
  66. dec(top);
  67. end;
  68.  
  69. while not isroot(x) do
  70. begin
  71. y:=fa[x]; z:=fa[y];
  72. if not isroot(y) then
  73. begin
  74. if (t[y,]=x)xor(t[z,]=y) then rotate(x)
  75. else rotate(y);
  76. end;
  77. rotate(x);
  78. end;
  79. end;
  80.  
  81. procedure access(x:longint);
  82. var last:longint;
  83. begin
  84. last:=;
  85. while x> do
  86. begin
  87. splay(x); t[x,]:=last; //pushup(x);
  88. last:=x; x:=fa[x];
  89. end;
  90. end;
  91.  
  92. procedure makeroot(x:longint);
  93. begin
  94. access(x); splay(x); rev[x]:=rev[x] xor ;
  95. end;
  96.  
  97. procedure link(x,y:longint);
  98. begin
  99. makeroot(x); fa[x]:=y;
  100. end;
  101.  
  102. procedure split(x,y:longint);
  103. begin
  104. makeroot(x); access(y); splay(y);
  105. end;
  106.  
  107. procedure cut(x,y:longint);
  108. begin
  109. makeroot(x); access(y); splay(y); t[y,]:=; fa[x]:=;
  110. end;
  111.  
  112. function min(x,y:longint):longint;
  113. begin
  114. if x<y then exit(x);
  115. exit(y);
  116. end;
  117.  
  118. begin
  119. assign(input,'bzoj2002.in'); reset(input);
  120. assign(output,'bzoj2002.out'); rewrite(output);
  121. readln(n);
  122. for i:= to n do
  123. begin
  124. read(x);
  125. fa[i]:=x+i; size[i]:=;
  126. if fa[i]>n then fa[i]:=n+;
  127. next[i]:=fa[i];
  128. end;
  129. size[n+]:=;
  130. readln(m);
  131. for i:= to m do
  132. begin
  133. read(x);
  134. case x of
  135. :
  136. begin
  137. read(y); inc(y);
  138. split(n+,y);
  139. writeln(size[t[y,]]);
  140. end;
  141. :
  142. begin
  143. read(x,y);
  144. inc(x); tmp:=min(x+y,n+);
  145. cut(x,next[x]); link(x,tmp); next[x]:=tmp;
  146. end;
  147. end;
  148. end;
  149. close(input);
  150. close(output);
  151. end.

【BZOJ2002】弹飞绵羊(LCT)的更多相关文章

  1. bzoj2002 弹飞绵羊 lct版

    这道题就是维护一个有根的lct 一开始建树全部建虚边 求多少次弹出就是求他到根的距离(根为n+1) 这里有个小技巧 将n+1作为根而没有虚根操作起来会比较方便 #include<cstdio&g ...

  2. BZOJ-2002 弹飞绵羊 Link-Cut-Tree (分块)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 6801 Solved: 3573 [Submi ...

  3. 洛谷P3203 [HNOI2010] 弹飞绵羊 [LCT]

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

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

    弹飞绵羊 题目传送门 解题思路 LCT. 将每个节点的权值设为\(1\),连接\(i\)和\(i+ki\),被弹飞就连上\(n\),维护权值和\(sum[]\).从\(j\)弹飞需要的次数就是\(sp ...

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

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

  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. BZOJ2002[Hnoi2010]弹飞绵羊——LCT

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

  9. [bzoj] 2002 弹飞绵羊 || LCT

    原题 简单的LCT练习题. 我们发现对于一个位置x,他只能跳到位置x+k,也就是唯一的父亲去.加入我们将弹飞的绵羊定义为跳到了n+1,那么这就形成了一棵树.而因为要修改k,所以这颗树是动态连边的,那么 ...

  10. 【HNOI2010】弹飞绵羊 - LCT

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

随机推荐

  1. Java使用HtmlUnit抓取js渲染页面

    需求: 需要采集js渲染的页面,有些网站的页面是js渲染的 实现: 基于HtmlUnit实现: public static void getAjaxPage() throws Exception{ W ...

  2. KTU Programming Camp (Winter Training Day 1)

    A.B.C(By musashiheart) 0216个人赛前三道题解 E(By ggg) Gym - 100735E Restore H(by pipixia) Gym - 100735H

  3. 手把手教你打造一个 Mac 风格的 Windows10(手动滑稽)

    Mark  https://www.sqlsec.com/2018/04/winmac.html 大佬写得很好,资瓷!! MyDock可能不是最新的,给出官方维护的网盘:https://pan.bai ...

  4. 1658: Easier Done Than Said?

    1658: Easier Done Than Said? Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 15  Solved: 12[Submit][St ...

  5. softmax_loss的归一化问题

    cnn网络中,网络更新一次参数是根据loss反向传播来,这个loss是一个batch_size的图像前向传播得到的loss和除以batch_size大小得到的平均loss. softmax_loss前 ...

  6. House of force

    0x00 利用要点 1.申请一块非常大的块. 2.精心构造size覆盖top chunk的chunk header. 3.调用malloc()实现任意地址写 0x01 申请一块非常大的块. 申请一个负 ...

  7. Noip2016 提高组 蚯蚓

    刚看到这道题:这题直接用堆+模拟不就可以了(并没有认真算时间复杂度) 于是用priority_queue水到了85分-- (STL大法好) 天真的我还以为是常数问题,于是疯狂卡常--(我是ZZ) 直到 ...

  8. Bootstrap历练实例:带有下拉菜单的标签和胶囊导航

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  9. shell脚本,按单词出现频率降序排序。

    [root@localhost oldboy]# cat file the squid project provides a number of resources toassist users de ...

  10. Ruby设计模式-观察者模式学习笔记

    observer.rb #!/bin/env ruby # encoding: utf-8 require 'observer' class CriminalMovement include Obse ...