首页 > 其他分享 >LCT 模板

LCT 模板

时间:2024-05-29 20:56:21浏览次数:17  
标签:LCT int void tr son fa ro 模板

  1 const int N = 1e5 + 5;
  2 
  3 int a[N];
  4 
  5 struct LCT {
  6     struct Tree {
  7         int son[2], tag, val, fa;
  8     } tr[N];
  9 
 10     void init(int ro) {
 11         tr[ro].son[0] = tr[ro].son[1] = tr[ro].fa = tr[ro].val = 0;
 12     }
 13 
 14     void modify(int ro) {
 15         swap(tr[ro].son[0], tr[ro].son[1]);
 16         tr[ro].tag ^= 1;
 17     }
 18 
 19     void pushdown(int ro) {
 20         if (tr[ro].tag) {
 21             modify(tr[ro].son[0]);
 22             modify(tr[ro].son[1]);
 23             tr[ro].tag = 0;
 24         }
 25     }
 26 
 27     void update(int ro) {
 28         tr[ro].val = tr[tr[ro].son[0]].val ^ tr[tr[ro].son[1]].val ^ a[ro];
 29     }
 30 
 31     int isroot(int ro) {
 32         int x = tr[ro].fa;
 33         if (!x) return 1;
 34         return (tr[x].son[0] != ro && tr[x].son[1] != ro);
 35     }
 36 
 37     void rotate(int ro) {
 38         int x = tr[ro].fa, y = tr[x].fa;
 39         int k = (tr[y].son[1] == x);
 40         if (tr[y].son[k] == x) {
 41             tr[y].son[k] = ro;
 42         }
 43         int z = (tr[x].son[1] == ro);
 44         tr[ro].fa = y;
 45         tr[x].fa = ro;
 46         tr[x].son[z] = tr[ro].son[z ^ 1];
 47         tr[tr[ro].son[z ^ 1]].fa = x;
 48         tr[ro].son[z ^ 1] = x;
 49         update(x), update(ro);
 50         if (tr[y].son[k] == ro) {
 51             update(y);
 52         }
 53     }
 54 
 55     void splay(int ro) {
 56         stack<int> st;
 57         st.push(ro);
 58         for (int i = ro; !isroot(i); i = tr[i].fa) st.push(tr[i].fa);
 59         while (!st.empty()) {
 60             pushdown(st.top());
 61             st.pop();
 62         }
 63         while (!isroot(ro)) {
 64             int x = tr[ro].fa;
 65             if (!isroot(x)) {
 66                 int y = tr[x].fa;
 67                 if ((tr[y].son[0] == x) ^ (tr[x].son[0] == ro)) rotate(ro);
 68                 else rotate(x);
 69             }
 70             rotate(ro);
 71         }
 72     }
 73 
 74     void access(int ro) {
 75         for (int i = 0; ro; i = ro, ro = tr[ro].fa) {
 76             splay(ro);
 77             tr[ro].son[1] = i;
 78             update(ro);
 79         }
 80     }
 81 
 82     void makeroot(int ro) {
 83         access(ro), splay(ro), modify(ro);
 84     }
 85 
 86     int getroot(int ro) {
 87         access(ro), splay(ro);
 88         int x = ro;
 89         while (tr[x].son[0]) x = tr[x].son[0];
 90         splay(x);
 91         return x;
 92     }
 93 
 94     void split(int x, int y) {
 95         makeroot(x), access(y), splay(y);
 96     }
 97 
 98     void link(int x, int y) {
 99         makeroot(x);
100         if (getroot(y) == x) return;
101         tr[x].fa = y;
102     }
103 
104     void cut(int x, int y) {
105         makeroot(x);
106         if (getroot(y) != x) return;
107         splay(y);
108         if (tr[x].son[1]) return;
109         tr[x].fa = 0;
110         tr[y].son[0] = 0;
111         update(y);
112     }
113 } Tr;
View Code

 

标签:LCT,int,void,tr,son,fa,ro,模板
From: https://www.cnblogs.com/ORzyzRO/p/18221038

相关文章

  • 使用 opencv 实现模板匹配功能前的预处理要求
    我使用opencv.TM_CCOEFF_NORMED函数来匹配发票模板。但是,模板匹配功能并没有产生准确的结果。匹配准确率相当低,只有50%。您能否建议我在流程中应包含或更改哪些内容以提高准确性?templateMap=cv.matchTemplate(img_r,resized_template,cv.TM_CCOEFF_NORMED)m......
  • 学习VUE3——模板引用ref
    在某些情况下,我们仍然需要直接访问底层DOM元素。要实现这一点,我们可以使用特殊的refattribute:<inputref="input">ref是一个特殊的attribute,和v-for章节中提到的key类似。它允许我们在一个特定的DOM元素或子组件实例被挂载后,获得对它的直接引用。这可能很有用,比......
  • 【模板】分裂合并 WBLT(自用)
    #include<bits/stdc++.h>usingnamespacestd;#ifdefLOCAL#definedebug(...)fprintf(stderr,__VA_ARGS__)#else#defineendl"\n"#definedebug(...)void(0)#endifusingLL=longlong;template<intN>structwblt{intch[N<......
  • c++ 设计模板
     ========一、设计模式的分类总体来说设计模式分为三大类创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板......
  • 解决Odoo Email模板中的时间与实际时间相差8小时的问题
     要解决OdooEmail模板中的时间与实际时间相差8小时的问题,最好的方法是先在服务器端处理时间,然后在模板中调用处理后的时间。在你的截图中,直接在模板中使用了`datetime.datetime.now()`,这会导致时区问题。以下是详细步骤:###1.在模型中添加一个方法来处理时区转换在你的模......
  • SUMER UI3.0组件库,基于Uni-app前端框架!一端开发,多端运行!本组件库可快速二次开发各种类
    sumer-ui介绍基于uView微信小程序UI组件库,兼容vue3。本插件是SUMER组件库,只提供组件库源码下载(不包含模板源码),本组件库可快速二次开发各种类别各行业模板,包括:商城、视频、直播、聊天、支付、新闻、社区、地图、导航、出行、社区、博客、新闻、游戏、影视、订票、广告等,......
  • 揭秘华为如此多成功项目的产品关键——Charter模板
    很多推行IPD(集成产品开发)体系的公司在正式研发产品前,需要开发Charter,以确保产品研发方向的正确。Charter,即项目任务书或商业计划书。Charter的呈现标志着产品规划阶段的完成,能为产品开发的投资评估和决策提供关键依据。在IPD体系中,Charter的核心逻辑主要体现在两点:一是产品值不值......
  • 第七十五节 Java设计模式 - 模板方法模式
    Java设计模式-模板方法模式在模板模式中,父抽象类公开几个抽象方法供子类实现。在父抽象类中有另一个方法或几个方法使用抽象方法来实现业务逻辑。抽象方法通常用于父类所需的每个步骤。例如,为了使用新的软件,我们需要下载,安装,配置和运行。如果我们要使用模板模式来编码逻......
  • Floyd算法的简单使用方法(模板)
    今天我们老师讲了Floyd算法,使用想着总结一下,方便后面进行复习,使用如果在接下来的文章中有哪里写的不对,或者表达不恰当,欢迎提出,谢谢!关于这个算法,我的理解是应用链接矩阵来进行存储值,通过比较来更新值,最后得出最短路径等问题的答案;使用模板:第一步就是使用宏定义来定义一个偏大......
  • 7-4 并查集【模板】
    给出一个并查集,请完成合并和查询操作。输入格式:第一行包含两个整数N、M,表示共有N个元素和M个操作。接下来M行,每行包含三个整数Zi​、Xi​、Yi​。当Zi​=1时,将Xi​与Yi​所在的集合合并。当Zi​=2时,输出Xi​与Yi​是否在同一集合内,是的话输出Y;否则的话输出N。输出格式:......