模板—数据结构—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. BZOJ4567 SCOI2016背单词(trie+贪心)

    倒过来变成查询前缀.考虑怎么排序.第一条代价n*n就相当于inf,说明一个单词的所有前缀都要排在它前面.那么串的依赖关系就是trie的结构.二三条说明代价是Σidi-idfa,那么显然最后的编号应该是 ...

  2. thymeleaf 布局layout

    以前写过一篇使用thymeleaf实现div中加载html 大部分内容都没问题,只是部分知识已经过时了. 重新记录: 依赖依然是 <dependency> <groupId>n ...

  3. BZOJ2299 [HAOI2011]向量 【裴蜀定理】

    题目链接 BZOJ2299 题解 题意就是给我们四个方向的向量\((a,b),(b,a),(-a,b),(b,-a)\),求能否凑出\((x,y)\) 显然我们就可以得到一对四元方程组,用裴蜀定理判断 ...

  4. 微信小程序,设置所有标签样式

    page, view, scroll-view, swiper, movable-area, cover-view, text, icon, rich-text, progress, button, ...

  5. 你知道HTML标签设计的本意吗?

    “DIV+CSS”这个词汇不知道害了多少人,也许其提出者本意并没有错,但是跟风者从表现曲解了其意思,认为整个页面就应当是DIV+CSS文件的组合.这样做,对于视觉上并没有什么影响,因为还原了之前设计的 ...

  6. oracleLinux7上安装oracle11g r2(脚本简单配置环境)

    一 环境脚本简单配置 #!/bin/bashmv /etc/yum.repos.d/* /tmpmv iso.repo /etc/yum.repos.d/tar zxvf a.tar.gzmv 7Se ...

  7. Bash 实例,第一部分

    您可能要问:为什么要学习 Bash 编程?好,以下是几条令人信服的理由: 已经在运行它 如果查看一下,可能会发现:您现在正在运行 bash.因为 bash 是标准 Linux shell,并用于各种目 ...

  8. POJ2154 Color

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10322   Accepted: 3360 Description Bead ...

  9. #error#学习方法,如何避免初始化错误

    #error#学习方法,如何避免初始化错误.错误来自:本博客的另一篇文章Demo示例程序源代码: ,01-导航实例-QQ空间.xcodeproj - CYLLoginViewController.mD ...

  10. appium的使用

    这套教程年久失修,问题的人也比较多,于是,我重新整理了一套appium入门教程. appium新手入门(1)—— appium介绍 appium新手入门(2)—— 安装 Android SDK app ...