IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> LCT 模板 -> 正文阅读

[C++知识库]LCT 模板

作者:recommend-item-box type_blog clearfix
const int MaxLct = 2 * 1e5;

#define ls(p) (Tr[p].ch[0])
#define rs(p) (Tr[p].ch[1])
#define fa(p) (Tr[p].fa)
#define rev(p) (Tr[p].rev)
struct Node {
    int rev;
    int ch[2], fa;
};
struct Link_Cut_Tree {
    Node Tr[MaxLct + 5];
    int st[MaxLct + 5];

    bool is_root (int p) { return (fa (p) == 0 || (ls (fa (p)) != p && rs (fa (p)) != p)); }
    void Change_Rev (int p) {
    	if (!p) return;
        rev (p) ^= 1; swap (ls (p), rs (p));
    }
    void Push_Down (int p) {
        if (rev (p)) {
            Change_Rev (ls (p)); Change_Rev (rs (p));
            rev (p) = 0;
        }
    }
    void Push_Up (int p) {
        if (!p) return;
        Push_Down (p);
    }
    void Rotate (int x) {
        int y = fa (x), z = fa (y);
        int d = rs (y) == x;
        if (!is_root (y)) Tr[z].ch[Tr[z].ch[1] == y] = x; Tr[x].fa = z;
        Tr[y].ch[d] = Tr[x].ch[!d]; if (Tr[x].ch[!d]) Tr[Tr[x].ch[!d]].fa = y;
        Tr[x].ch[!d] = y; Tr[y].fa = x;
        Push_Up (y); Push_Up (z);
    }
    void splay (int x) {//旋转到所在splay的根
        int y = x, z, tp = 0;
        st[++tp] = y;
        while (!is_root (y)) y = fa (y), st[++tp] = y;
        while (tp) Push_Down (st[tp--]);
        while (!is_root (x)) {
            y = fa (x), z = fa (y);
            if (!is_root (y)) {
                if ((rs (z) == y) ^ (rs (y) == x)) Rotate (x);
                else Rotate (y);
            }
            Rotate (x);
        }
    }
    void Access (int x) {//把原树上 x 到根的路径变为重边
    	int y = x; x = 0;
        for (; y != 0; x = y, y = fa (y)) {
        	splay (y);
        	rs (y) = x;
        	Push_Up (y);
		}
    }
    int Find_Root (int x) {//返回 x 所在原树的根,并把原树的根旋转到辅助树的根
        Access (x), splay (x);
        while (ls (x)) Push_Down (x), x = ls (x);
        return splay (x), x;
    }
    void Make_Root (int x) {//把 x 变为原树的根,并且旋转到辅助树的根
		Access (x);
		splay (x);
		Change_Rev (x);
	}
    void Link (int x, int y) {//建一条 (x, y)
        Make_Root (x);
        if (Find_Root (y) != x) fa (x) = y; //不在一棵树内
    }
    void Cut (int x, int y) {//把 (x, y) 断掉(没有则操作无效)
        Make_Root (x);
		Access (y), splay (y);
        if (Find_Root (y) == x && fa (y) == x && !ls (y)) 
			fa (y) = rs (x) = 0, Push_Up (x);
    }
    void Get (int x, int y) {//取出 x, y 的链,并且把 y 作为辅助树和原树的根 
		Make_Root (y), Access (x), splay (y), Push_Up (y);
	}
};
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:14:26  更:2022-03-12 17:15:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:50:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码