洛谷 P3690 【模板】Link Cut Tree (动态树) || bzoj 3282: Tree
https://blog.csdn.net/saramanda/article/details/55253627
https://blog.csdn.net/CHHNZ/article/details/55504875
lct模板
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- namespace LCT
- {
- struct Node
- {
- Node *ch[],*fa;
- bool rev;
- int dat,xorx;
- }nodes[];
- int mem;
- Node *getnode()
- {
- return nodes+(mem++);
- }
- bool isroot(Node *x)
- {
- return (!x->fa)||((x->fa->ch[]!=x)&&(x->fa->ch[]!=x));
- }
- void upd(Node *x)
- {
- x->xorx=(x->ch[]?x->ch[]->xorx:)^(x->ch[]?x->ch[]->xorx:)^x->dat;
- }
- void pd(Node *x)
- {
- if(x->rev)
- {
- swap(x->ch[],x->ch[]);
- if(x->ch[]) x->ch[]->rev^=;
- if(x->ch[]) x->ch[]->rev^=;
- x->rev=;
- }
- }
- bool gson(Node *o) {return o==o->fa->ch[];}//获得是父亲的左儿子(返回0)还是右儿子(1),要求保证存在父亲
- void rotate(Node *o,bool d)
- //在o子树中执行d=0左旋,d=1右旋,在旋转前不标记下传,并将o父节点的对应子节点由o变为需要值,要求保证存在子树(!d)
- {
- Node *k=o->ch[!d];if(!isroot(o)) o->fa->ch[gson(o)]=k;//注意这一句修改o父节点的要写在前面,曾经出过错调了一会
- o->ch[!d]=k->ch[d];k->ch[d]=o;
- upd(o);upd(k);
- k->fa=o->fa;o->fa=k;if(o->ch[!d]) o->ch[!d]->fa=o;
- }
- Node *st[];int top;
- void solvetag(Node *o)
- {
- while(!isroot(o)) st[++top]=o,o=o->fa;
- st[++top]=o;
- while(top) pd(st[top--]);
- }
- void splay(Node *o)
- {
- solvetag(o);
- Node *fa,*fafa;bool d1,d2;
- while(!isroot(o))
- {
- fa=o->fa;d1=(o==fa->ch[]);
- if(isroot(fa)) rotate(fa,d1);
- else
- {
- fafa=o->fa->fa;d2=(fa==fafa->ch[]);//要保证fa不是root之后才能获取这两个值,曾错过
- if(d1==d2) rotate(fafa,d1),rotate(fa,d1);//zig-zig,两次相同方向的单旋,先把父亲转上去,再把自己转上去
- else rotate(fa,d1),rotate(fafa,d2);//zig-zag,两次相反方向的单旋,连续两次把自己转上去
- }
- }
- }
- void access(Node *o)
- {
- for(Node *lst=NULL;o;lst=o,o=o->fa)
- {
- splay(o);//此处不pushdown是由于splay中保证进行过了
- o->ch[]=lst;upd(o);//注意upd
- }
- }
- Node *gtop(Node *o)
- {
- access(o);splay(o);
- for(;o->ch[];o=o->ch[],pd(o));//此处不在开始前pushdown(o)是由于splay中保证进行过了
- splay(o);return o;//听说这里不splay一下也很难卡掉
- }
- void mtop(Node *o) {access(o);splay(o);o->rev^=;}
- void link(Node *x,Node *y)
- {
- if(gtop(x)==gtop(y)) return;
- mtop(y);y->fa=x;
- }
- void cut(Node *x,Node *y)
- {
- mtop(x);access(y);splay(y);
- if(y->ch[]!=x||x->ch[]) return;//如果x、y之间直接有边,那么上面一行的操作之后应当是x与y在单独一棵splay中,那么一定保证y左子节点是x且x没有右子节点
- x->fa=y->ch[]=NULL;//注意,改的是x的父亲和y的子节点(虽然x的确是树的根,但是此时在splay上是y的子节点,不能搞混)
- upd(y);//注意
- }
- int query(Node *x,Node *y)
- {
- mtop(x);access(y);splay(y);
- //if(gtop(y)!=x) return 0;//此题保证x与y连通,不需要
- return y->xorx;
- }
- }
- LCT::Node *nd[];
- int n,m;
- int main()
- {
- int i,idx,x,y;
- scanf("%d%d",&n,&m);
- for(i=;i<=n;i++)
- {
- nd[i]=LCT::getnode();
- scanf("%d",&nd[i]->dat);nd[i]->xorx=nd[i]->dat;//注意改xorx
- }
- for(i=;i<=m;i++)
- {
- scanf("%d%d%d",&idx,&x,&y);
- if(idx==) printf("%d\n",LCT::query(nd[x],nd[y]));
- else if(idx==) LCT::link(nd[x],nd[y]);
- else if(idx==) LCT::cut(nd[x],nd[y]);
- else if(idx==) LCT::splay(nd[x]),nd[x]->dat=y,LCT::upd(nd[x]);
- //可能是由于题面和数据的一些奥妙重重的原因,此题即使不splay(nd[x])也可以A掉,但是splay到根之后却能保证改变该点权值只会影响自身的xorx
- }
- return ;
- }
洛谷 P3690 【模板】Link Cut Tree (动态树) || bzoj 3282: Tree的更多相关文章
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 洛谷P3690 [模板] Link Cut Tree [LCT]
题目传送门 Link Cut Tree 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代 ...
- 洛谷.3690.[模板]Link Cut Tree(动态树)
题目链接 LCT(良心总结) #include <cstdio> #include <cctype> #include <algorithm> #define gc ...
- 【刷题】洛谷 P3690 【模板】Link Cut Tree (动态树)
题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- AC日记——【模板】Link Cut Tree 洛谷 P3690
[模板]Link Cut Tree 思路: LCT模板: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 30 ...
- 洛谷P3690 Link Cut Tree (模板)
Link Cut Tree 刚开始写了个指针版..调了一天然后放弃了.. 最后还是学了黄学长的板子!! #include <bits/stdc++.h> #define INF 0x3f3 ...
- 洛谷P3690 【模板】Link Cut Tree (LCT)
题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...
- 洛谷 P3690 Link Cut Tree
题目背景 动态树 题目描述 给定N个点以及每个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...
- Link Cut Tree 动态树 小结
动态树有些类似 树链剖分+并查集 的思想,是用splay维护的 lct的根是动态的,"轻重链"也是动态的,所以并没有真正的轻重链 动态树的操作核心是把你要把 修改/询问/... 等 ...
随机推荐
- jmeter的线程组执行顺序不以其出现的顺序发生变化
jmeter可以同时配置多个线程组,那么他们的执行顺序是什么呢?和他们出现的顺序有什么关系呢? 先说下几个特殊的线程组:tearDown线程组和setUp线程组,tearDown线程组一定在最后执行, ...
- pycharm查看代码注释的方法,代码编写日志及作者信息等
竟然在边栏有个右键的快捷键.annotate可以查看代码书写日期及作者 鼠标悬停可以看到更加详细的时间等信息 原理应该是利用git blame
- IOS开发 APP提交程序上传流程
由于苹果的机制,在非越狱机器上安装应用必须通过官方的App Store,开发者开发好应用后上传App Store,也需要通过审核等环节.AppCan作为一个跨主流平台的一个开发平台,也对ipa包上传A ...
- 【转载】epoll与select/poll的区别总结
因为这道题目经常被问到.干脆总结一下,免得遗漏了. 参考文章:http://www.cnblogs.com/qiaoconglovelife/p/5735936.html 1 本质上都是同步I/O 三 ...
- Use JavaScript to Export Your Data as CSV
原文: http://halistechnology.com/2015/05/28/use-javascript-to-export-your-data-as-csv/ --------------- ...
- ZOJ 3632 Watermelon Full of Water (线段树 区间更新 + dp)
题目大意: 让每天都能吃到西瓜. 最少须要花多少钱. 思路分析: dp[pos] 就表示 要让 前i天每天都有西瓜吃.最少须要花多少钱. 那么假设你买这个西瓜的话. 那么这个西瓜能吃的持续时间都要更 ...
- VUE组件如何与iframe通信问题
vue组件内嵌一个iframe,现在想要在iframe内获取父vue组件内信息,由于本人技术有限,采用的是H5新特性PostMessage来解决跨域问题. postMessage内涵两个API: on ...
- 常见网络摄像机默认使用的端口,RTSP地址
品牌 默认IP地址 WEB RTSP HTTPS 数据 ONVIF 海康威视 192.168.1.64/DHCP用户名admin 密码自己设 80 554 443 8000 80 大华 192 ...
- [NOI2018] 归程 可持久化并查集
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个n 个节点.m 条边的无向连通图(节点的编号从 1至 n).我们依次用 l,a描述一条边的长度.海拔. ...
- spring boot自定义properity
1.spring boot使用application.properties默认了很多配置. 但有时需要自定义配置.若在application.properties添加属性: app.name=fish ...