模板—数据结构—LCT

Code:

#include <cstdio>
#include <algorithm>
using namespace std;
#define N 300010
int fa[N],son[N][2],size[N],n,m;long long sum[N],num[N]; bool rev[N];
bool check(int p) {return son[fa[p]][1]==p;}
bool isroot(int p) {return son[fa[p]][0]!=p&&son[fa[p]][1]!=p;}
void pushup(int p) {if(p) size[p]=1+size[son[p][0]]+size[son[p][1]]
,sum[p]=num[p]^sum[son[p][0]]^sum[son[p][1]];}
void pushdown(int p)
{
if(!rev[p]) return; rev[p]=0;
swap(son[son[p][0]][0],son[son[p][0]][1]),rev[son[p][0]]^=1;
swap(son[son[p][1]][0],son[son[p][1]][1]),rev[son[p][1]]^=1;
}
void update(int p) {if(!isroot(p)) update(fa[p]);pushdown(p);}
void rotate(int p)
{
int tmp1=fa[p],tmp2=fa[tmp1],tmp3=check(p);
fa[son[tmp1][tmp3]=son[p][tmp3^1]]=tmp1,fa[p]=tmp2;
if(!isroot(tmp1)) son[tmp2][check(tmp1)]=p;
fa[son[p][tmp3^1]=tmp1]=p,pushup(tmp1),pushup(p);
}
void splay(int p)
{
update(p);
for(int i;i=fa[p],!isroot(p);rotate(p))
if(!isroot(i)) rotate(check(p)==check(i)?i:p);
}
void access(int p) {for(int t=0;p;t=p,p=fa[p]) splay(p),son[p][1]=t,pushup(p);}
void makeroot(int p) {access(p),splay(p),rev[p]^=1,swap(son[p][0],son[p][1]);}
void link(int x,int y) {makeroot(x),access(y),splay(y),fa[x]=y;}
bool in_all(int x,int y)
{
makeroot(x),access(y),splay(y);
while((son[y][0]&&(!rev[y]))||(son[y][1]&&rev[y])) pushdown(y),y=son[y][0];
return x==y;
}
void cut(int x,int y)
{makeroot(x),access(y),splay(y);if(in_all(x,y)&&fa[x]==y&&son[y][0]==x&&(!son[x][1])) fa[x]=son[y][0]=0,pushup(y);}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&num[i]),sum[i]=num[i],size[i]=1;
for(int i=1,opt,y;i<=m;i++)
{
long long x;
scanf("%d%lld%d",&opt,&x,&y);
if(opt==0) makeroot(x),access(y),splay(y),printf("%lld\n",sum[y]);
else if(opt==1) {if(!in_all(x,y)) link(x,y);}
else if(opt==2) cut(x,y);
else makeroot(x),access(x),num[x]=y,pushup(x);
}
}

  

模板—数据结构—LCT的更多相关文章

  1. 树上数据结构——LCT

    目录 树上数据结构--LCT 概述 基本概念 核心操作 其他操作 完整模板 树上数据结构--LCT 概述 LCT是一种强力的树上数据结构,支持以下操作: 链上求和 链上求最值 链上修改 子树修改 子树 ...

  2. link cut tree模板(LCT模板)

    update:2017.09.26 #include <bits/stdc++.h> using namespace std; struct Link_Cut_Tree { + ; ], ...

  3. [SinGuLaRiTy] 复习模板-数据结构

    [SinGuLaRiTy-1040] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 二维线段树 2D_Segment_Tree //示例:单 ...

  4. 【模板】LCT

    核心思想: 动态维护一个森林.支持删边,加边,查询链信息等很多操作. 由若干棵$Splay$组成,每棵$Splay$维护一条链,以深度作为关键字. 也就是说$Splay$的中序遍历相当于从上到下遍历这 ...

  5. 模板 - 数据结构 - 栈/Stack

    普通的栈大家都会写,STL的栈据说默认实现方式是deque,没关系反正deque跑得飞快. 这里收录的是一些奇怪的栈,当然双栈实现的队列收录在队列里面. 对顶栈 众所周知,栈可以维护一系列前缀和,包括 ...

  6. 模板 - 数据结构 - ST表/SparseTable

    SparseTable,俗称ST表,其功能,就是静态的RMQ(区间最值查询)问题的解决.注意传入查询的时候两个参数的合法性,或者可以进行一次全部初始化来使得越界值不产生负面影响.不过访问越界是写程序的 ...

  7. 模板 - 数据结构 - 可持久化无旋Treap/PersistentFHQTreap

    有可能当树中有键值相同的节点时,貌似是要对Split和Merge均进行复制的,本人实测:只在Split的时候复制得到了一个WA,但只在Merge的时候复制还是AC,可能是恰好又躲过去了.有人说假如确保 ...

  8. 模板 - 数据结构 - ST表 + 二维ST表

    区间最大值,$O(nlogn)$ 预处理,$O(1)$ 查询,不能动态修改.在查询次数M显著大于元素数量N的时候看得出差距. 令 $f[i][j]$ 表示 $[i,i+2^j-1]$ 的最大值. 显然 ...

  9. 模板汇总——LCT

    link-cut tree #define lch(x) tr[x].son[0] #define rch(x) tr[x].son[1] ; struct Node{ int rev, rt; ], ...

随机推荐

  1. hdu 2874 Connections between cities (并查集+LCA)

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  2. LeetCode--Remove Linked List Element

    Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --& ...

  3. Powershell使用真实的对象工作

    Powershell使用真实的对象工作 来源 https://www.pstips.net/powershell-work-with-reallife-objects.html 每一个Powershe ...

  4. 【CF edu 30 C. Strange Game On Matrix】

    time limit per test 1 second memory limit per test  256 megabytes input standard input output standa ...

  5. 一个JavaScript日期格式化扩展函数

    我们都知道在Java和PHP语言中,有专门用于格式化日期对象的类和函数,例如Java中的DateFormat等等,通过这些类和函数,我们可以方便的将一个日期对象按照格式的要求输出为字符串,例如对于同一 ...

  6. 安卓和html的互相调用

    1.写html和安卓布局 <Button android:id="@+id/btn" android:layout_width="wrap_content" ...

  7. Tile Cut~网络流入门题

    Description When Frodo, Sam, Merry, and Pippin are at the Green Dragon Inn drinking ale, they like t ...

  8. matlab求矩阵、向量的模

    求矩阵的模: function count = juZhenDeMo(a,b) [r,c] = size(a);%求a的行列 [r1,c1] = size(b);%求b的行列 count = 0; f ...

  9. 记另类Request method 'GET' not supported

    一般遇到Request method 'GET' not supported这种问题,大家都会找相应controller下的具体方法,把get改为post之类.但是我这次是在访问静态资源,static ...

  10. 最短路算法详解(Dijkstra,Floyd)

    最短路径 在一个无权的图中,若从一个顶点到另一个顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1.由于从一个顶点到另一个顶点可能存在着多条路径,每条路径上所经过 ...