https://blog.csdn.net/saramanda/article/details/55253627

https://blog.csdn.net/CHHNZ/article/details/55504875

lct模板

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. namespace LCT
  5. {
  6. struct Node
  7. {
  8. Node *ch[],*fa;
  9. bool rev;
  10. int dat,xorx;
  11. }nodes[];
  12. int mem;
  13. Node *getnode()
  14. {
  15. return nodes+(mem++);
  16. }
  17. bool isroot(Node *x)
  18. {
  19. return (!x->fa)||((x->fa->ch[]!=x)&&(x->fa->ch[]!=x));
  20. }
  21. void upd(Node *x)
  22. {
  23. x->xorx=(x->ch[]?x->ch[]->xorx:)^(x->ch[]?x->ch[]->xorx:)^x->dat;
  24. }
  25. void pd(Node *x)
  26. {
  27. if(x->rev)
  28. {
  29. swap(x->ch[],x->ch[]);
  30. if(x->ch[]) x->ch[]->rev^=;
  31. if(x->ch[]) x->ch[]->rev^=;
  32. x->rev=;
  33. }
  34. }
  35. bool gson(Node *o) {return o==o->fa->ch[];}//获得是父亲的左儿子(返回0)还是右儿子(1),要求保证存在父亲
  36. void rotate(Node *o,bool d)
  37. //在o子树中执行d=0左旋,d=1右旋,在旋转前不标记下传,并将o父节点的对应子节点由o变为需要值,要求保证存在子树(!d)
  38. {
  39. Node *k=o->ch[!d];if(!isroot(o)) o->fa->ch[gson(o)]=k;//注意这一句修改o父节点的要写在前面,曾经出过错调了一会
  40. o->ch[!d]=k->ch[d];k->ch[d]=o;
  41. upd(o);upd(k);
  42. k->fa=o->fa;o->fa=k;if(o->ch[!d]) o->ch[!d]->fa=o;
  43. }
  44. Node *st[];int top;
  45. void solvetag(Node *o)
  46. {
  47. while(!isroot(o)) st[++top]=o,o=o->fa;
  48. st[++top]=o;
  49. while(top) pd(st[top--]);
  50. }
  51. void splay(Node *o)
  52. {
  53. solvetag(o);
  54. Node *fa,*fafa;bool d1,d2;
  55. while(!isroot(o))
  56. {
  57. fa=o->fa;d1=(o==fa->ch[]);
  58. if(isroot(fa)) rotate(fa,d1);
  59. else
  60. {
  61. fafa=o->fa->fa;d2=(fa==fafa->ch[]);//要保证fa不是root之后才能获取这两个值,曾错过
  62. if(d1==d2) rotate(fafa,d1),rotate(fa,d1);//zig-zig,两次相同方向的单旋,先把父亲转上去,再把自己转上去
  63. else rotate(fa,d1),rotate(fafa,d2);//zig-zag,两次相反方向的单旋,连续两次把自己转上去
  64. }
  65. }
  66. }
  67. void access(Node *o)
  68. {
  69. for(Node *lst=NULL;o;lst=o,o=o->fa)
  70. {
  71. splay(o);//此处不pushdown是由于splay中保证进行过了
  72. o->ch[]=lst;upd(o);//注意upd
  73. }
  74. }
  75. Node *gtop(Node *o)
  76. {
  77. access(o);splay(o);
  78. for(;o->ch[];o=o->ch[],pd(o));//此处不在开始前pushdown(o)是由于splay中保证进行过了
  79. splay(o);return o;//听说这里不splay一下也很难卡掉
  80. }
  81. void mtop(Node *o) {access(o);splay(o);o->rev^=;}
  82. void link(Node *x,Node *y)
  83. {
  84. if(gtop(x)==gtop(y)) return;
  85. mtop(y);y->fa=x;
  86. }
  87. void cut(Node *x,Node *y)
  88. {
  89. mtop(x);access(y);splay(y);
  90. if(y->ch[]!=x||x->ch[]) return;//如果x、y之间直接有边,那么上面一行的操作之后应当是x与y在单独一棵splay中,那么一定保证y左子节点是x且x没有右子节点
  91. x->fa=y->ch[]=NULL;//注意,改的是x的父亲和y的子节点(虽然x的确是树的根,但是此时在splay上是y的子节点,不能搞混)
  92. upd(y);//注意
  93. }
  94. int query(Node *x,Node *y)
  95. {
  96. mtop(x);access(y);splay(y);
  97. //if(gtop(y)!=x) return 0;//此题保证x与y连通,不需要
  98. return y->xorx;
  99. }
  100. }
  101. LCT::Node *nd[];
  102. int n,m;
  103. int main()
  104. {
  105. int i,idx,x,y;
  106. scanf("%d%d",&n,&m);
  107. for(i=;i<=n;i++)
  108. {
  109. nd[i]=LCT::getnode();
  110. scanf("%d",&nd[i]->dat);nd[i]->xorx=nd[i]->dat;//注意改xorx
  111. }
  112. for(i=;i<=m;i++)
  113. {
  114. scanf("%d%d%d",&idx,&x,&y);
  115. if(idx==) printf("%d\n",LCT::query(nd[x],nd[y]));
  116. else if(idx==) LCT::link(nd[x],nd[y]);
  117. else if(idx==) LCT::cut(nd[x],nd[y]);
  118. else if(idx==) LCT::splay(nd[x]),nd[x]->dat=y,LCT::upd(nd[x]);
  119. //可能是由于题面和数据的一些奥妙重重的原因,此题即使不splay(nd[x])也可以A掉,但是splay到根之后却能保证改变该点权值只会影响自身的xorx
  120. }
  121. return ;
  122. }

洛谷 P3690 【模板】Link Cut Tree (动态树) || bzoj 3282: Tree的更多相关文章

  1. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  2. 洛谷P3690 [模板] Link Cut Tree [LCT]

    题目传送门 Link Cut Tree 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代 ...

  3. 洛谷.3690.[模板]Link Cut Tree(动态树)

    题目链接 LCT(良心总结) #include <cstdio> #include <cctype> #include <algorithm> #define gc ...

  4. 【刷题】洛谷 P3690 【模板】Link Cut Tree (动态树)

    题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...

  5. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  6. AC日记——【模板】Link Cut Tree 洛谷 P3690

    [模板]Link Cut Tree 思路: LCT模板: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 30 ...

  7. 洛谷P3690 Link Cut Tree (模板)

    Link Cut Tree 刚开始写了个指针版..调了一天然后放弃了.. 最后还是学了黄学长的板子!! #include <bits/stdc++.h> #define INF 0x3f3 ...

  8. 洛谷P3690 【模板】Link Cut Tree (LCT)

    题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...

  9. 洛谷 P3690 Link Cut Tree

    题目背景 动态树 题目描述 给定N个点以及每个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...

  10. Link Cut Tree 动态树 小结

    动态树有些类似 树链剖分+并查集 的思想,是用splay维护的 lct的根是动态的,"轻重链"也是动态的,所以并没有真正的轻重链 动态树的操作核心是把你要把 修改/询问/... 等 ...

随机推荐

  1. Qt布局管理器的使用(一)

    曾经对Qt的布局管理器掌握的还不清楚,今天特意学习了下.感觉收获还挺大的,特意拿出来和大家分享. 首先.要明确布局管理器的用处,及使我们的界面看起来比較整洁.美化.另外一点就是为了使我们的控件可以更随 ...

  2. HDU 5303 Delicious Apples (贪心 枚举 好题)

    Delicious Apples Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Other ...

  3. enumerateObjectsUsingBlock 、for 、for(... in ...) 的差别 &amp; 性能測试

    for VS for(... in ...) for 的应用范围广基本能够NSArray.NSArray以及C语言的数组等,而for(... in ...)仅限于NSArray.NSArray等 fo ...

  4. IEnumerator<TItem>和IEnumerator Java 抽象类和普通类、接口的区别——看完你就顿悟了

    IEnumerable 其原型至少可以说有15年历史,或者更长,它是通过 IEnumerator 来定义的,而后者中使用装箱的 object 方式来定义,也就是弱类型的.弱类型不但会有性能问题,最主要 ...

  5. Java使用三种不同循环结构对1+2+3+...+100 求和

    ▷//第一种求法,使用while结构 /** * @author 9527 * @since 19/6/20 */ public class Gaosi { public static void ma ...

  6. JavaGUI应用程序打包及数字签名

    JavaGUI应用程序部署 JavaGUI程序发布分类: a.Applet:可以嵌入到浏览器中,通过网页的方式展示给用户 b.application :有两种发布方式 :打包成jar包通过bat的方式 ...

  7. Android多线程更新UI的方式

    Android下,对于耗时的操作要放到子线程中,要不然会残生ANR,本次我们就来学习一下Android多线程更新UI的方式. 首先我们来认识一下anr: anr:application not rep ...

  8. 最新Bootstrap手册

    http://www.jqhtml.com/bootstraps-syntaxhigh/index.html

  9. [读书笔记]流畅的Python(Fluent Python)

    <流畅的Python>这本书是图灵科技翻译出版的一本书,作者Luciano Ramalho. 作者从Python的特性角度出发,以Python的数据模型和特殊方法为主线,主要介绍了pyth ...

  10. Activity动态添加Fragment时遇到的问题

    1.Activity动态调用代码 TitleFragement a = new TitleFragement();        getFragmentManager().beginTransacti ...