勉强算是结了个大坑吧或者才开始

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #define R(a,b,c) for(register int a = (b); (a) <= (c); ++(a))
  7. #define nR(a,b,c) for(register int a = (b); (a) >= (c); --(a))
  8. #define Fill(a,b) memset(a, b, sizeof(a))
  9. #define Swap(a,b) ((a) ^= (b) ^= (a) ^= (b))
  10. #define ll long long
  11. #define u32 unsigned int
  12. #define u64 unsigned long long
  13. #define ON_DEBUGG
  14. #ifdef ON_DEBUGG
  15. #define D_e_Line printf("\n----------\n")
  16. #define D_e(x) cout << (#x) << " : " << x << endl
  17. #define Pause() system("pause")
  18. #define FileOpen() freopen("in.txt", "r", stdin)
  19. #define FileSave() freopen("out.txt", "w", stdout)
  20. #include <ctime>
  21. #define TIME() fprintf(stderr, "\ntime: %.3fms\n", clock() * 1000.0 / CLOCKS_PER_SEC)
  22. #else
  23. #define D_e_Line ;
  24. #define D_e(x) ;
  25. #define Pause() ;
  26. #define FileOpen() ;
  27. #define FileSave() ;
  28. #define TIME() ;
  29. //char buf[1 << 21], *p1 = buf, *p2 = buf;
  30. //#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
  31. #endif
  32. using namespace std;
  33. struct ios{
  34. template<typename ATP>inline ios& operator >> (ATP &x){
  35. x = 0; int f = 1; char ch;
  36. for(ch = getchar(); ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;
  37. while(ch >= '0' && ch <= '9') x = x * 10 + (ch ^ '0'), ch = getchar();
  38. x *= f;
  39. return *this;
  40. }
  41. }io;
  42. template<typename ATP>inline ATP Max(ATP a, ATP b){
  43. return a > b ? a : b;
  44. }
  45. template<typename ATP>inline ATP Min(ATP a, ATP b){
  46. return a < b ? a : b;
  47. }
  48. template<typename ATP>inline ATP Abs(ATP a){
  49. return a < 0 ? -a : a;
  50. }
  51. const int N = 300007;
  52. struct node {
  53. int ch[2], fa, val, sum;
  54. bool rev;
  55. }t[N];
  56. #define ls t[u].ch[0]
  57. #define rs t[u].ch[1]
  58. inline bool Ident(int u) {
  59. return t[t[u].fa].ch[1] == u;
  60. }
  61. inline bool IsRoot(int u) {
  62. return t[t[u].fa].ch[0] != u && t[t[u].fa].ch[1] != u;
  63. }
  64. inline void Pushup(int u) {
  65. t[u].sum = t[u].val ^ t[ls].sum ^ t[rs].sum;
  66. }
  67. inline void Pushrev(int u) {
  68. Swap(t[u].ch[0], t[u].ch[1]);
  69. t[u].rev ^= 1;
  70. }
  71. inline void Pushdown(int u) {
  72. if(!t[u].rev) return;
  73. if(t[u].ch[0]) Pushrev(t[u].ch[0]);
  74. if(t[u].ch[1]) Pushrev(t[u].ch[1]);
  75. t[u].rev = 0;
  76. }
  77. int sta[N], top;
  78. inline void Rotate(int x) {
  79. int y = t[x].fa, z = t[y].fa, k = Ident(x);
  80. t[x].fa = z; if(!IsRoot(y)) t[z].ch[Ident(y)] = x;
  81. t[y].ch[k] = t[x].ch[k ^ 1], t[t[x].ch[k ^ 1]].fa = y;
  82. t[x].ch[k ^ 1] = y, t[y].fa = x;
  83. Pushup(y), Pushup(x);
  84. }
  85. inline void Splay(int u) {
  86. int x = u;
  87. top = 0;
  88. while(!IsRoot(u)) {
  89. sta[++top] = u;
  90. u = t[u].fa;
  91. }
  92. sta[++top] = u;
  93. nR(i,top,1){
  94. Pushdown(sta[i]);
  95. }
  96. while(!IsRoot(x)) {
  97. int y = t[x].fa;
  98. if(!IsRoot(y)){
  99. Ident(x) == Ident(y) ? Rotate(y) : Rotate(x);
  100. }
  101. Rotate(x);
  102. }
  103. Pushup(x);
  104. }
  105. inline void Access(int u) {
  106. for(int v = 0; u; v = u, u = t[u].fa){
  107. Splay(u);
  108. t[u].ch[1] = v;
  109. Pushup(u);
  110. }
  111. }
  112. inline void MakeRoot(int u) {
  113. Access(u);
  114. Splay(u);
  115. Pushrev(u);
  116. }
  117. inline int FindRoot(int u) {
  118. Access(u);
  119. Splay(u);
  120. while(ls) u = ls;
  121. Splay(u);
  122. return u;
  123. }
  124. inline void Split(int u, int v) {
  125. MakeRoot(u);
  126. Access(v);
  127. Splay(v);
  128. }
  129. inline void Link(int u, int v) {
  130. Split(u, v);
  131. t[u].fa = v;
  132. }
  133. inline void Cut(int u, int v){
  134. MakeRoot(u);
  135. if(FindRoot(v) == u && t[v].fa == u && !t[v].ch[0]){
  136. t[v].fa = t[u].ch[1] = 0;
  137. Pushup(u);
  138. }
  139. }
  140. inline void Modify(int u, int w) {
  141. // Access(u);
  142. Splay(u);
  143. t[u].val = w;
  144. Pushup(u);
  145. }
  146. int main() {
  147. //FileOpen();
  148. //FileSave();
  149. int n, m;
  150. io >> n >> m;
  151. R(i,1,n){
  152. io >> t[i].val;
  153. t[i].sum = t[i].val;
  154. }
  155. while(m--){
  156. int opt, x, y;
  157. io >> opt >> x >> y;
  158. switch(opt){
  159. case 0:
  160. Split(x, y);
  161. printf("%d\n", t[y].sum);
  162. break;
  163. case 1:
  164. Link(x, y);
  165. break;
  166. case 2:
  167. Cut(x, y);
  168. break;
  169. case 3:
  170. Modify(x, y);
  171. break;
  172. }
  173. }
  174. return 0;
  175. }

LuoguP3690 【模板】Link Cut Tree (LCT)的更多相关文章

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

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

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

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

  3. 模板Link Cut Tree (动态树)

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

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

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

  5. BZOJ 3282 Link Cut Tree (LCT)

    题目大意:维护一个森林,支持边的断,连,修改某个点的权值,求树链所有点点权的异或和 洛谷P3690传送门 搞了一个下午终于明白了LCT的原理 #include <cstdio> #incl ...

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

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

  7. Luogu 3690 Link Cut Tree

    Luogu 3690 Link Cut Tree \(LCT\) 模板题.可以参考讲解和这份码风(个人认为)良好的代码. 注意用 \(set\) 来维护实际图中两点是否有直接连边,否则无脑 \(Lin ...

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

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

  9. P3690 【模板】Link Cut Tree (动态树)

    P3690 [模板]Link Cut Tree (动态树) 认父不认子的lct 注意:不 要 把 $fa[x]$和$nrt(x)$ 混 在 一 起 ! #include<cstdio> v ...

  10. LG3690 【模板】Link Cut Tree (动态树)

    题意 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y是联通的 ...

随机推荐

  1. BZOJ4713 迷失的字符串 解题报告

    BZOJ4713 题目大意:有 \(n\) 个点 \(n-1\) 条边,每条边有一个字符.给你 \(m\) 个字符串 \(s_i\),问每个字符串是否可以通过树上的一条简单路径表示. \(n,m\le ...

  2. git实战-多分支开发-2022新项目

    现在开发中大多数公司中都在使用Git这个代码版本管理工具,几乎可以说是已经成为标配,刚入职不久的这家新公司也不例外. 去公司没多久,开始搭建项目,然后创建开发分支,有多少个后端人员就创建多少个开发分支 ...

  3. python3在使用类基础时,遇到错误TypeError: module.**init**() takes at most 2 arguments (3 given)

    python3在使用类基础时,遇到错误TypeError: module.init() takes at most 2 arguments (3 given) 1.原因:直接导入的py文件,而没有导入 ...

  4. R数据分析:如何简洁高效地展示统计结果

    之前给大家写过一篇数据清洗的文章,解决的问题是你拿到原始数据后如何快速地对数据进行处理,处理到你基本上可以拿来分析的地步,其中介绍了如何选变量如何筛选个案,变量重新编码,如何去重,如何替换缺失值,如何 ...

  5. MySQL数据库5

    内容概要 pyhton操作MySQL SQL注入问题 修改表SQL语句补充 视图.触发器.储存过程 事务 流程控制 函数 索引与慢查询优化 内容详情 pyhton操作MySQL python中支持操作 ...

  6. HMS Core 视频编辑服务开放模板能力,助力用户一键Get同款酷炫视频

    前言 短视频模板,是快捷创作短视频的一种方式,一般由专业设计师或模板创作人制作,用户只需替换视频模板中的部分素材,便可生成一支与模板一样的创意视频.这种省时省力.无需"烧脑"构思创 ...

  7. ExtJS 布局-Center布局(Center layout)

    更新记录: 2022年6月12日 检查发布. 2022年6月1日 开始. 1.说明 center布局将子项放置在容器的中心. 2.设置布局方法 在父容器中设置 layout: 'center', // ...

  8. C#取消正在运行的Task

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年6月29日. 一.说明 Task默认就依托于底层线程池中的线程,使用.NET为我们定义好的CancellationTokenSourc ...

  9. SQL Server 2008~2019版本序列号/密钥/激活码 汇总

    SQL Server 2019 Enterprise:HMWJ3-KY3J2-NMVD7-KG4JR-X2G8G Strandard:PMBDC-FXVM3-T777P-N4FY8-PKFF4 SQL ...

  10. 循环码、卷积码及其python实现

    摘要:本文介绍了循环码和卷积码两种编码方式,并且,作者给出了两种编码方式的编码译码的python实现 关键字:循环码,系统编码,卷积码,python,Viterbi算法 循环码的编码译码 设 \(C\ ...