Description

给定N个点以及每个点的权值,要你处理接下来的M个操作。
操作有4种。操作从0到3编号。点从1到N编号。
0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和。
保证x到y是联通的。
1:后接两个整数(x,y),代表连接x到y,若x到Y已经联通则无需连接。
2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在。
3:后接两个整数(x,y),代表将点X上的权值变成Y。

Input

第1行两个整数,分别为N和M,代表点数和操作数。
第2行到第N+1行,每行一个整数,整数在[1,10^9]内,代表每个点的权值。
第N+2行到第N+M+1行,每行三个整数,分别代表操作类型和操作所需的量。
1<=N,M<=300000

Output

对于每一个0号操作,你须输出X到Y的路径上点权的Xor和。

Sample Input

3 3
1
2
3
1 1 2
0 1 2
0 1 1

Sample Output

3
1

解题思路:

这是LCT很好的模板。
主要难点是处理一下路径权值,和判断两个点是否联通(以防重边)
路径权值:单独将x到y的路径提取(split)Splay维护链的时候在将节点处权值上传,最后查值就好
判断有无x到y的边:将x到y的路径提取,若直接连接无中间值就是有边。
代码:
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define lll tr[spc].ch[0]
  5. #define rrr tr[spc].ch[1]
  6. #define ls ch[0]
  7. #define rs ch[1]
  8. const int N=;
  9. struct trnt{
  10. int ch[];
  11. int lzt;
  12. int fa;
  13. int val;
  14. int sum;
  15. bool anc;
  16. }tr[N];
  17. int n,m;
  18. int cnt;
  19. bool whc(int spc)
  20. {
  21. return tr[tr[spc].fa].rs==spc;
  22. }
  23. void pushup(int spc)
  24. {
  25. tr[spc].sum=tr[lll].sum^tr[rrr].sum^tr[spc].val;
  26. return ;
  27. }
  28. void trr(int spc)
  29. {
  30. if(!spc)
  31. return ;
  32. std::swap(lll,rrr);
  33. tr[spc].lzt^=;
  34. return ;
  35. }
  36. void pushdown(int spc)
  37. {
  38. if(tr[spc].lzt)
  39. {
  40. trr(lll);
  41. trr(rrr);
  42. tr[spc].lzt=;
  43. }
  44. return ;
  45. }
  46. void recal(int spc)
  47. {
  48. if(!tr[spc].anc)
  49. recal(tr[spc].fa);
  50. pushdown(spc);
  51. }
  52. void rotate(int spc)
  53. {
  54. int f=tr[spc].fa;
  55. bool k=whc(spc);
  56. tr[f].ch[k]=tr[spc].ch[!k];
  57. tr[spc].ch[!k]=f;
  58. if(tr[f].anc)
  59. {
  60. tr[f].anc=false;
  61. tr[spc].anc=true;
  62. }else
  63. tr[tr[f].fa].ch[whc(f)]=spc;
  64. tr[spc].fa=tr[f].fa;
  65. tr[f].fa=spc;
  66. tr[tr[f].ch[k]].fa=f;
  67. pushup(f);
  68. pushup(spc);
  69. }
  70. void splay(int spc)
  71. {
  72. recal(spc);
  73. while(!tr[spc].anc)
  74. {
  75. int ft=tr[spc].fa;
  76. if(tr[ft].anc)
  77. {
  78. rotate(spc);
  79. return ;
  80. }
  81. if(whc(spc)^whc(ft))
  82. rotate(spc);
  83. else
  84. rotate(ft);
  85. rotate(spc);
  86. }
  87. return ;
  88. }
  89. void access(int spc)
  90. {
  91. int lsts=;
  92. while(spc)
  93. {
  94. splay(spc);
  95. tr[rrr].anc=true;
  96. tr[lsts].anc=false;
  97. rrr=lsts;
  98. pushup(spc);
  99. lsts=spc;
  100. spc=tr[spc].fa;
  101. }
  102. return ;
  103. }
  104. void Mtr(int spc)
  105. {
  106.  
  107. access(spc);
  108. splay(spc);
  109. trr(spc);
  110. return ;
  111. }
  112. int spmrt(int spc)
  113. {
  114. access(spc);
  115. splay(spc);
  116. while(lll)
  117. {
  118. pushdown(spc);
  119. spc=lll;
  120. }
  121. return spc;
  122. }
  123. void split(int x,int y)
  124. {
  125. Mtr(x);
  126. access(y);
  127. splay(y);
  128. }
  129. void Link(int x,int y)
  130. {
  131. Mtr(x);
  132. if(spmrt(y)!=x)
  133. tr[x].fa=y;
  134. return ;
  135. }
  136. void Cut(int x,int y)
  137. {
  138. Mtr(x);
  139. if(spmrt(y)==x&&tr[x].fa==y&&!tr[y].rs)
  140. {
  141. tr[x].anc=;
  142. tr[y].ls=;
  143. tr[x].fa=;
  144. pushup(y);
  145. }
  146. return ;
  147. }
  148. int main()
  149. {
  150. scanf("%d%d",&n,&m);
  151. for(int i=;i<=n;i++)
  152. {
  153. scanf("%d",&tr[i].val);
  154. tr[i].anc=true;
  155. }
  156. while(m--)
  157. {
  158. int cmd,x,y;
  159. scanf("%d%d%d",&cmd,&x,&y);
  160. if(cmd==)
  161. {
  162. split(x,y);
  163. printf("%d\n",tr[y].sum);
  164. }
  165. if(cmd==)
  166. Link(x,y);
  167. if(cmd==)
  168. Cut(x,y);
  169. if(cmd==)
  170. {
  171. splay(x);
  172. tr[x].val=y;
  173. pushup(x);
  174. }
  175. }
  176. return ;
  177. }

BZOJ3282: Tree (LCT模板)的更多相关文章

  1. [bzoj3282]Tree (lct)

    昨天看了一天的lct..当然幸好最后看懂了(也许吧..) 论善良学长的重要性T_T,老司机带带我! 这题主要是删边的时候还要判断一下..蒟蒻一开始天真的以为存在的边才能删结果吃了一发wa... 事实是 ...

  2. LuoguP3690 【模板】Link Cut Tree (动态树) LCT模板

    P3690 [模板]Link Cut Tree (动态树) 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两 ...

  3. [洛谷P1501] [国家集训队]Tree II(LCT模板)

    传送门 这是一道LCT的板子题,说白了就是在LCT上支持线段树2的操作. 所以我只是来存一个板子,并不会讲什么(再说我也不会,只能误人子弟2333). 不过代码里的注释可以参考一下. Code #in ...

  4. LCT模板

    之前一直用的LCT模板,因为其实个人对LCT和Splay不是很熟,所以用起来总觉得略略的坑爹,过了一段时间就忘了,但事实上很多裸的LCT要改的东西是不多的,所以今天写了些注释,以后可能套起模板来会得心 ...

  5. HDU 5002 Tree LCT 区间更新

    Tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action?c ...

  6. Link-Cut Tree(LCT)&TopTree讲解

    前言: Link-Cut Tree简称LCT是解决动态树问题的一种数据结构,可以说是我见过功能最强大的一种树上数据结构了.在此与大家分享一下LCT的学习笔记.提示:前置知识点需要树链剖分和splay. ...

  7. HDU5002 Tree(LCT)

    今天做了一道LCT模板题之后忽然间好像记起来LCT的模板怎么用了,于是就把上次网络赛的一道LCT补一下.典型的删边,加边操作,还有路径加和路径set为一个数.维护的是路径第二大以及它有多少个,后来想想 ...

  8. LCT 模板及套路总结

    这一个月貌似已经考了无数次\(LCT\)了..... 保险起见还是来一发总结吧..... A. LCT 模板 \(LCT\) 是由大名鼎鼎的 \(Tarjan\) 老爷发明的. 主要是用来维护树上路径 ...

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

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

随机推荐

  1. iBatis框架使用 4步曲

    iBatis是一款使用方便的数据訪问工具,也可作为数据持久层的框架.和ORM框架(如Hibernate)将数据库表直接映射为Java对象相比.iBatis是将SQL语句映射为Java对象. 相对于全自 ...

  2. 2.CString转换到char*

    多字节模式下: CString -->char * CString str1 ="; char *t1 =str1.GetBuffer(str1.GetLength()); str1. ...

  3. android 客户端 Cookie处理

    Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密). Cookie最早是网景公司的前雇员Lou Montul ...

  4. js 判断对touch事件支持

    $.support = (function() { var support = { touch: !!(('ontouchstart' in window) || window.DocumentTou ...

  5. Linux PuTTY 更改字体

    Linux PuTTY默认的字体比较小看着比较不舒服,Linux PuTTY的字体更改与Windows下的设置有所不同 1.Linux PuTTY默认的字体 ,Font used for ordina ...

  6. Python正则表达式初识(一)

    首先跟大家简单唠叨两句为什么要学习正则表达式,为什么在网络爬虫的时候离不开正则表达式.正则表达式在处理字符串的时候扮演着非常重要的角色,在网络爬虫的时候也十分常用,大家可以把它学的简单一些,但是不能不 ...

  7. 使用form-create动态生成vue组件

    使用form-create动态生成vue自定义组件和嵌套表单组件 [github] | [说明文档] 示例 let rule = [ { type:'row', children:[ { type:' ...

  8. 循环GridControl所有行

    ; i < gridView1.RowCount; i++) { DataRowView row = (DataRowView)gridView1.GetRow(i); } gridView1是 ...

  9. [Javascript] Compose multiple functions for new behavior in JavaScript

    In this lesson you will create a utility function that allows you to quickly compose behavior of mul ...

  10. poj2486--Apple Tree(树状dp)

    Apple Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7789   Accepted: 2606 Descri ...