linkcuttree(无图慎入)(代码片段)

idqi idqi     2023-01-05     582

关键词:

类似树链剖分(其实直接记住就可以了),提前放代码

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<iostream>
  4 #include<algorithm>
  5 #include<cstring>
  6 #include<climits>
  7 #include<cmath>
  8 #define N (int)(3e5+5)
  9 using namespace std;
 10 
 11 int n,m,st[N],z;
 12 struct tree 
 13 
 14     int vi,si,son[2],rev,fa;
 15     #define vi(x) t[x].vi
 16     #define si(x) t[x].si
 17     #define fa(x) t[x].fa
 18     #define rev(x) t[x].rev
 19     #define son(x,y) t[x].son[y]
 20  t[N];
 21 
 22 void pushup(int x) si(x)=vi(x)^si(son(x,0))^si(son(x,1));
 23 void pushr(int x) swap(son(x,0),son(x,1));rev(x)^=1;
 24 void pushdown(int x)
 25 
 26     if(rev(x))
 27     
 28         if(son(x,0)) pushr(son(x,0));
 29         if(son(x,1)) pushr(son(x,1));    
 30         rev(x)=0;
 31     
 32 
 33 
 34 int get(int x) return son(fa(x),1)==x;
 35 bool nroot(int x) return son(fa(x),0)==x||son(fa(x),1)==x;
 36 
 37 void rotate(int x)
 38 
 39     int y=fa(x),z=fa(y),k=get(x);
 40     if(nroot(y)) son(z,get(y))=x;fa(x)=z;
 41     son(y,k)=son(x,k^1);if(son(y,k)) fa(son(y,k))=y;
 42     son(x,k^1)=y;fa(y)=x;pushup(y);pushup(x);
 43 
 44 void Splay(int x)
 45 
 46     int y=x;st[++(z=0)]=y;
 47     while(nroot(y)) st[++z]=y=fa(y);
 48     while(z) pushdown(st[z--]);
 49     while(nroot(x))
 50     
 51         int y=fa(x),z=fa(y);
 52         if(nroot(y)) rotate(get(x)==get(y)?y:x);
 53         rotate(x);
 54     
 55     pushup(x);
 56 
 57 
 58 void access(int x)
 59 
 60     for(int y=0;x;x=fa(y=x))
 61         Splay(x),son(x,1)=y,pushup(x);
 62 
 63 void makeroot(int x)
 64 
 65     access(x);Splay(x);
 66     pushr(x);pushup(x);    
 67 
 68 void split(int x,int y) makeroot(x);access(y);Splay(y);
 69 int findroot(int x)
 70 
 71     access(x);Splay(x);
 72     while(son(x,0)) pushdown(x),x=son(x,0);
 73     return x;
 74 
 75 
 76 bool link(int x,int y)
 77 
 78     makeroot(x);
 79     if(findroot(y)==x) return false;
 80     fa(x)=y;return true;
 81 
 82 
 83 bool cut(int x,int y)
 84 
 85     makeroot(x);
 86     if(findroot(y)!=x||fa(x)!=y||son(x,1)) return 1;
 87     fa(x)=son(y,0)=0;pushup(y);
 88 
 89 
 90 int main()
 91 
 92     scanf("%d%d",&n,&m);
 93     for(int i=1;i<=n;i++) scanf("%d",&vi(i));
 94     for(int i=1,type,x,y;i<=m;i++)
 95     
 96         scanf("%d%d%d",&type,&x,&y);
 97         switch(type)
 98         
 99             case 0:split(x,y);printf("%d
",si(y));break;
100             case 1:link(x,y);break;
101             case 2:cut(x,y);break;
102             case 3:Splay(x);vi(x)=y;    
103         
104     
105     return 0;
106 

 

Link Cut Tree的一些注意:

  同一个Splay中没有相同深度点  

  Splay需要先放标记

  然后Splay的根的父亲不一定是0

  认父不认子,就是儿子父亲不变,但是父亲只记录一个儿子

 

核心操作:

  access 提取一个到根的路径

    考虑现在是一个由多个Splay组成的树(或者森林),首先肯定是将x转到根节点,然后直接换到这个Splay的整个父亲(就是Splay中深度最小的点的父亲),然后因为需要将整个Splay和父亲相连,为了维护性质,需要将它父亲的其他儿子断掉,直接Splay(父亲),然后将右边儿子改为这个Splay(注意这个是一个递推的过程)

  

  makeroot 将这个点变为整个树的根

    比较简单,主要首先就是开辟一条到根的路径,然后Splay,但是依旧不是深度最小的点,直接打入翻转标记即可

 

  然后。。。其他就通过这些直接推就可以了(其实就是比较懒

lct(linkcuttree)动态树(代码片段)

模板参考:https://blog.csdn.net/saramanda/article/details/55253627几个知识点:1、LCT中用Splay维护链,这些Splay叫做“辅助树“。辅助树以它上面每个节点的深度为关键字维护,就是辅助树中每个节点左儿子的深度小于当前节点的深度... 查看详情

linkcuttree动态树小结(代码片段)

动态树有些类似树链剖分+并查集的思想,是用splay维护的lct的根是动态的,"轻重链"也是动态的,所以并没有真正的轻重链动态树的操作核心是把你要把修改/询问/...等等一系列的操作的树链放到一个splay里,然后用splay根据相对... 查看详情

洛谷3690:模板linkcuttree——题解(代码片段)

https://www.luogu.org/problemnew/show/P3690给定n个点以及每个点的权值,要你处理接下来的m个操作。操作有4种。操作从0到3编号。点从1到n编号。0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和。保证x到y是联通的。1:... 查看详情

p3690模板linkcuttree(动态树)(代码片段)

哇,做梦也没想到我居然能写LCT题意:给定n个点以及每个点的权值,要你处理接下来的m个操作。操作有4种。操作从0到3编号。点从1到n编号。0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和。保证x到y是联通... 查看详情

洛谷p3690模板linkcuttree(lct)(代码片段)

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

刷题洛谷p3690模板linkcuttree(动态树)(代码片段)

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

二叉搜索树的实现源码(源码较长,请慎入)(代码片段)

实现二叉搜索树的一种好方法是利用二叉树抽象数据类型。我们以BisTree这个名称来代表二叉搜索树这种数据结构。通过typedef方式将BisTree(二叉搜索树)实现为BiTree(二叉树)的别名。采用typedef方法使得二叉搜索树具有了某种程度... 查看详情

[模板]linkcuttree(代码片段)

...:后接两个整数(x,y),代表将点x上的权值变成y。Solution(LinkCutTree)模板题(findroot)后要(Splay)到根?不然复杂度不保证???在洛谷上实测(535ms),还算比较快吧函数变量名奇异+神仙缩行(ightarrow)还是别看了Code?//2019.1.2618:41-22:54#inclu... 查看详情

p3690模板linkcuttree(动态树)(代码片段)

P3690【模板】LinkCutTree(动态树)注意:不要把$fa[x]$和$nrt(x)$混在一起!#include<cstdio>voidswap(int&a,int&b)a^=b^=a^=b;#defineN300005intn,m,s[N],v[N],ch[2][N],fa[N],rev[N];#definelcch[0][x]#definercch[1][x]boolnrt(intx)returnch[0][fa[x]]==x||ch[1][fa[x]]==x;voidu... 查看详情

[wc2006]水管局长-linkcuttree(代码片段)

...,t1,t2,t3,t4;structEdgeintu,v,w,f;e[N];structOperatinginto,p,q;op[N];structLinkCutTreeinttop,q[N],ch[N][2],fa[N],rev[N],mx[N],mp[N],val[N];inlinevoidpushup(intx)mx[0]=mp[0]=0;mx[x]=max(max(mx[ch[x][0]],mx[ch[x][1]]),val[x]);if(mx[x]==mx[ch[x][0]])mp[x]=mp[ch[x][0]];if(mx[x]==mx[ch[x][1]])mp[x]=mp[ch... 查看详情

如果程序员面试时大家都说真话…画面过于真实,易引起不适请慎入(代码片段)

????????关注后回复 “进群” ,拉你进程序员交流群????????面试官:你好,这是你面试的第一家公司吗?程序员小王:当然不是啦,面了30多家,都不要我。面试官:哦哦哦,没事,我们面试... 查看详情

[p3690]linkcuttree(代码片段)

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

dedecms列表页有图调用缩略图无图留空的方法(代码片段)

...则不显示任何图片。其实也就是去掉默认织梦的“暂无图片”的小图, 查看详情

p3690模板linkcuttree(动态树)(代码片段)

LCTLCT即Link-Cut-Tree维护一个森林,支持很多操作,比如:维护链上信息(min,max,sum,xor。。。。。。)换根动态维护联通性维护子树信息概念虚边:连接儿子与父亲,儿子记录父亲,父亲不记录儿子(父不认子)实边:父子互... 查看详情

ac日记——模板linkcuttree洛谷p3690

【模板】LinkCutTree 思路:  LCT模板; 代码:#include<bits/stdc++.h>usingnamespacestd;#definemaxn300005intn,m,val[maxn];inttop,ch[maxn][2],f[maxn],xr[maxn],q[maxn],rev[maxn];inlinevoidin(int&now 查看详情

linkcuttree学习笔记

从这里开始动态树问题和LinkCutTree一些定义access操作换根操作link和cut操作时间复杂度证明LinkCutTree维护链上信息LinkCutTree维护子树信息小结动态树问题和LinkCutTree  动态树问题是一类要求维护一个有根树森林,支持对树的分割,... 查看详情

tcp/ip,udp,icmp,arp协议族简介--纯图慎点

  ISO/OSI的网络模型架构  TCP/IP参考模型的层次结果    以太网头部结构  以太网属于数据链路层,属于最基本的协议结构   IP协议  IP协议为TCP,UDP,ICMP提供最基本的数据传输通路   ICMP协议  IC... 查看详情

luogu3690模板linkcuttree(动态树)

题目luogu3690硫硼作者想提醒大家,WA了TLE了RE了的,也许只是主函数写错了代码#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<cstdlib>#include<cstring>usingnamespacestd 查看详情