首页 > 其他分享 >LCT 模板

LCT 模板

时间:2023-07-20 09:25:54浏览次数:26  
标签:Node LCT nil rs void fa ls 模板

以 P3690 为例。

#include <iostream>
#define UP(i,s,e) for(auto i=s; i<e; ++i)
namespace LCT{ // }{{{
struct Node{
	Node *ls, *rs;
	Node *fa;
	int sum, val;
	bool rev;
	Node();
} nil_, *nil = &nil_;
Node::Node(){ fa = ls = rs = nil; }
void pushup(Node *x){ x->sum = x->val ^ x->ls->sum ^ x->rs->sum; }
void reverse(Node *);
void pushdown(Node *x){
	if(!x->rev) return;
	std::swap(x->ls, x->rs);
	if(x->ls != nil) reverse(x->ls);
	if(x->rs != nil) reverse(x->rs);
	x->rev = 0;
}
bool is_root(Node *x){ return x->fa->ls != x && x->fa->rs != x; }
bool is_rs(Node *x){ return x->fa->rs == x; }
void rotate(Node *x){
	Node *y = x->fa, *z = y->fa;
	if(!is_root(y)) {
		if(is_rs(y)) z->rs = x;
		else z->ls = x;
	}
	if(is_rs(x)){
		y->rs = x->ls; x->ls->fa = y;
		x->ls = y;
	} else {
		y->ls = x->rs; x->rs->fa = y;
		x->rs = y;
	}
	y->fa = x;
	x->fa = z;
	pushup(y); 
	pushup(x);
}
void update(Node *x){
	if(!is_root(x)) update(x->fa);
	pushdown(x);
}
void splay(Node *x){
	update(x);
	for(Node *f=x->fa; !is_root(x); rotate(x), f=x->fa){
		if(!is_root(f)) rotate(is_rs(x) == is_rs(f) ? f : x);
	}
}
void access(Node *x){
	for(Node *p = nil; x != nil; p=x, x=x->fa){
		splay(x);
		x->rs = p;
		pushup(x);
	}
}
void reverse(Node *x){ x->rev ^= 1; }
void makeroot(Node *x){ 
	access(x); 
	splay(x);
	reverse(x);
}
void split(Node *x, Node *y){
	makeroot(x);
	access(y);
	splay(y);
}
Node *findroot(Node *x){
	access(x);
	splay(x);
	for(;;){
		pushdown(x);
		if(x->ls == nil) break;
		x = x->ls;
	}
	splay(x);
	return x;
}
void link(Node *x, Node *y){
	makeroot(x);
	if(findroot(y) != x) x->fa = y;
}
void cut(Node *x, Node *y){
	split(x, y);
	if(y->ls == x) x->fa = y->ls = nil;
	pushup(y);
}
} // {}}}
namespace m{ // }{{{
constexpr int N = 1e5, M = 3e5;
using std::cin;
using std::cout;
using namespace LCT;
Node nds[N];
int in, im;
void work(){
	cin >> in >> im;
	UP(i, 0, in) cin >> nds[i].val;
	UP(i, 0, im){
		int op, x, y;
		cin >> op >> x >> y;
		x--, y--;
		if(op == 0){
			split(nds+x, nds+y);
			cout << nds[y].sum << '\n';
		} else if(op == 1){
			link(nds+x, nds+y);
		} else if(op == 2){
			cut(nds+x, nds+y);
		} else {
			splay(nds+x);
			y++;
			nds[x].val = y;
			pushup(nds+x);
		}
	}
}
} // {}}}
int main(){ std::ios::sync_with_stdio(0); std::cin.tie(0); m::work(); return 0;}

标签:Node,LCT,nil,rs,void,fa,ls,模板
From: https://www.cnblogs.com/x383494/p/17567376.html

相关文章

  • 建站新手福利:免费网页模板大合集,快速打造专业网站!
    今天给大家带来的网站模板素材,网站类型丰富,包含户外旅行、餐饮、个人网站等等,可以学习和参考其中的布局排版和配色。 ⬇⬇⬇点击获取更多设计资源https://js.design/community?category=design&source=bky&plan=bbqbky772   1、设计公司&工作室相信大家都希望拥有属......
  • 上传jrxml模板进行JasperReport解析导致任意代码执行RCE
    JasperReport是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF、HTML、XML等格式。该库完全由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态内容。JasperReports附带了报表编译器,可以在报表表达式内部使用Groovy脚本语言或JavaScript编......
  • 二分图相关算法模板
    二分图判定概念解释二分图:设$G=(V,E)$是一个无向图,如果顶点$V$可分割为两个互不相交的子集$(A,B)$,并且图中的每条边$(i,j)$所关联的两个顶点$i$和$j$分别属于这两个不同的顶点集$(i\inA,j\inB)$,则称图$G$为一个二分图相关性质定理一个图是二分图$\Leftrightarrow$图中不......
  • creo设置默认模板
    Creo6.0设置文件默认模板为公制模板“mmns_part_solid”在Creo6.0中,文件的默认模板是英制模板“inlbs_part_solid”,此文件模板中尺寸的单位是inch。我们建模中需要的单位是mm,改变Creo文件默认的单位有两种方法。1【新建】对话框取消勾选【使用默认模板】对话框(1......
  • 22 个精美的网站管理后台模板推荐
    互联网上有大量的关于如何设计网站的教程,可以使你的工作更加容易和简单。但关于网站管理后台的教程却比较少。今天,我们提供一些非常强大的管理面板,可以帮助开发者设计网站的后台部分,另外,漂亮的后台也可以使工作变得舒心。    下面列出了22个漂亮的网站管理后台模板。 1) S......
  • 题解 P3803 【模板】多项式乘法(FFT)
    感觉题解区不是写的太高深,就是写的太高深。所以给初中、小学和幼儿园的萌新准备一篇简单易懂的良心题解~前置知识一、多项式的系数表示法和点值表示法。\(A(x)=\sum\limits_{i=0}^{n-1}a_i\cdotx^i\)系数:\((a_0,a_1,a_2...a_{n-2},a_{n-1})\)。点值:\((x_0,y_0),(x_1,y_1)...(......
  • 题解 P6091 【模板】原根
    题解太高深,自己整理一份。阶的定义:若\(\gcd(a,m)=1\),则使\(a^l\equiv1\pmod{m}\)的最小的\(l\)称为\(a\)关于模\(m\)的阶,记为\(\operatorname{ord}_ma\)。阶的性质:根据欧拉定理,\(a^{\varphi(m)}\equiv1\pmod{m}\),所以\(\operatorname{ord}_ma\mid\varphi(m)\)......
  • 【8.0】Django框架之模板层
    【一】模板语法的传值{{}}:变量相关{%%}:逻辑相关【1】数据准备路由#模板语法传值url(r'^index/',views.index),【2】基本数据类型(1)视图defindex(request):#模板语法可以传递的后端Python数据类型#整型a=123#浮点型b=11.11......
  • 模板
    模板合集目录模板合集A-基本算法。快速幂B-数据结构。树状数组线段树平衡树笛卡尔树分块莫队LCALCT虚树DSUontreeC-图论kruskal重构树SPFA圆方树二分图二分图最大匹配网络流A-基本算法。快速幂llqpow(lla,intb){ llres=1ll; while(b){ if(b&1)res=res*a%m......
  • 模板方法模式
    目录1.概述2.结构3.案例实现4.优缺点5.适用场景6.JDK源码解析1.概述在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如,去银......