洛谷P3690 【模板】Link Cut Tree (动态树)
时间:2021-04-07
本文章向大家介绍洛谷P3690 【模板】Link Cut Tree (动态树),主要包括洛谷P3690 【模板】Link Cut Tree (动态树)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目
https://www.luogu.com.cn/problem/P3690
仅仅是存个代码而已,以备复习。。。
代码
#include<cstdlib>
#include<algorithm>
#define maxn (int)(1e5+10)
using namespace std;
int val[maxn];
struct LCT{
struct node{
int father,lson,rson,path_parent;
int sum,tag,size;
} tree[maxn];
int cnt;
private:
void update(int x){
tree[x].sum=tree[tree[x].lson].sum^tree[tree[x].rson].sum^val[x];
tree[x].size=tree[tree[x].lson].size+tree[tree[x].rson].size+1;
}
void pushdown(int x){
if(tree[x].tag){
tree[x].tag=0;
if(tree[x].lson) tree[tree[x].lson].tag^=1;
if(tree[x].rson) tree[tree[x].rson].tag^=1;
swap(tree[x].lson,tree[x].rson);
}
}
void zig(int x){
int y=tree[x].father;
tree[x].father=tree[y].father;
tree[x].path_parent=tree[y].path_parent;
tree[y].path_parent=0;
if(tree[y].father)
if(tree[tree[y].father].lson==y) tree[tree[y].father].lson=x;
else tree[tree[y].father].rson=x;
int z=tree[x].rson;
if(z) tree[z].father=y;
tree[y].lson=z;
tree[x].rson=y;
tree[y].father=x;
update(y);update(x);
}
void zag(int x){
int y=tree[x].father;
tree[x].father=tree[y].father;
tree[x].path_parent=tree[y].path_parent;
tree[y].path_parent=0;
if(tree[y].father)
if(tree[tree[y].father].lson==y) tree[tree[y].father].lson=x;
else tree[tree[y].father].rson=x;
int z=tree[x].lson;
if(z) tree[z].father=y;
tree[y].rson=z;
tree[x].lson=y;
tree[y].father=x;
update(y);update(x);
}
void splay(int x){
pushdown_all(x);
while(tree[x].father){
int y=tree[x].father,z=tree[y].father;
if(!z){
if(tree[y].lson==x) zig(x);
else zag(x);
}
else{
if(tree[y].lson==x&&tree[z].lson==y){
zig(y);zig(x);
}
else if(tree[y].rson==x&&tree[z].rson==y){
zag(y);zag(x);
}
else if(tree[y].lson==x&&tree[z].rson==y){
zig(x);zag(x);
}
else{
zag(x);zig(x);
}
}
}
}
void pushdown_all(int x){
if(tree[x].father) pushdown_all(tree[x].father);
pushdown(x);
return;
}
void access(int x){
splay(x);
if(tree[x].rson){
tree[tree[x].rson].path_parent=x;
tree[tree[x].rson].father=0;
tree[x].rson=0;
update(x);
}
while(tree[x].path_parent){
int u=tree[x].path_parent;
splay(u);
if(tree[u].rson){
tree[tree[u].rson].path_parent=u;
tree[tree[u].rson].father=0;
update(u);
}
tree[u].rson=x;
tree[x].father=u;
tree[x].path_parent=0;
update(u);
x=u;
}
splay(x);
}
void evert(int x){
access(x);splay(x);
tree[x].tag^=1;
pushdown(x);
}
int find_root(int x){
access(x);splay(x);
int t=x;
while(1){
pushdown(t);
if(!tree[t].lson) break;
t=tree[t].lson;
}
return t;
}
public:
void link(int x,int y){
evert(x);
if(find_root(y)==x) return;
access(y);splay(y);
tree[y].father=x;
tree[x].lson=y;
update(x);
}
void cut(int x,int y){
evert(x);
if(find_root(y)!=x) return;
access(y);splay(y);
if(tree[y].size>2) return;
tree[x].father=0;
tree[y].lson=0;
update(y);
}
int get_sum(int x,int y){
evert(x);
access(y);splay(y);
return tree[y].sum;
}
void modify(int x,int y){
val[x]=y;
splay(x);
update(x);
}
void insert(int x){
tree[x].father=tree[x].lson=tree[x].rson=0;
tree[x].path_parent=0;
tree[x].size=1;
tree[x].tag=0;
tree[x].sum=val[x];
}
} T;
int main(){
int i,j,n,m;
int op,x,y;
// freopen("T.in","r",stdin);
// freopen("myans.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&val[i]);
for(i=1;i<=n;i++)
T.insert(i);
for(i=1;i<=m;i++){
scanf("%d%d%d",&op,&x,&y);
if(op==0) printf("%d\n",T.get_sum(x,y));
if(op==1) T.link(x,y);
if(op==2) T.cut(x,y);
if(op==3) T.modify(x,y);
}
// system("pause");
return 0;
}
原文地址:https://www.cnblogs.com/landmine-sweeper/p/14629225.html
- 管理混合云环境的5个要点
- Team Foundation Server 2010 – Basic Installation
- 富文本编辑器的一键排版功能
- 通过ProGet搭建一个内部的Nuget服务器
- Mercury Editor学习心得
- 无意禁止使用:英伟达官方回应GeForce软件条款更改
- Ext JS 6 新特性和工具
- 为你的WordPress 博客文章页面增加多彩排版条
- java: web应用中不经意的内存泄露
- java: web应用中不经意的内存泄露
- velocity模板引擎学习(4)-在standalone的java application中使用velocity及velocity-tools
- mac上开启ftp
- Web前端开发的四个阶段
- 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOS搭建PHP服务器环境简明教程
- CentOS7.2安装MySql5.7并开启远程连接授权的教程
- linux查看防火墙状态与开启关闭命令详解
- linux防火墙iptables规则的查看、添加、删除和修改方法总结
- Linux expect实现自动登录脚本实例代码
- scRNA-seq marker identification(一)
- 关于linux权限s权限和t权限详解
- centOS7 桥接模式设置静态Ip的方法步骤
- linux环境下卸载oracle 11g的过程
- Seurat包基本分析实战—文献图表复现
- ubuntu配置tftp服务的步骤小结
- CentOS7下GitLab跨大版本升级的方法
- 解决Linux system v 共享内存问题
- Linux下core文件的使用方法详解
- 使用Kubeadm在CentOS7.2上部署Kubernetes集群的方法