首页 > 其他分享 >文艺平衡树

文艺平衡树

时间:2024-02-15 17:15:41浏览次数:19  
标签:int siz tr 文艺 fa 平衡 now define

Describe:

给定一个有 \(n\) 个元素且没有重复元素的序列,进行 \(m\) 次翻转操作,输出最终序列。

Solution:

翻转操作类似 LCT 中的 makeroot,稍加改造即可。

splay 有一个很好的性质,就是旋转过后也不改变中序遍历的顺序。所以若将左右子树交换且对子树内的节点做同样的操作,就是一次中序遍历的翻转。所以只要把区间单独分离出一个子树,就可以很好的实现翻转操作。

对于区间 \(\left[l,r\right]\),可以把 \(l\) 的前驱旋转到根上,再把 \(r\) 的后继旋转到右子树,这样整个区间 \(\left[l,r\right]\) 都在根的右子树的左子树。(如下图)

image

当然,你让 \(r\) 的后继当根也没问题,这样区间 \(\left[l,r\right]\) 就应对应根的左子树的右子树。最后按中序遍历输出即可。

Code:

bool _Start;
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
// #define DEBUG
namespace IO
{
	#define TP template<typename T>
	#define TP_ template<typename T,typename ... T_>
	#ifdef DEBUG
	#define gc() (getchar())
	#else
	char buf[1<<20],*p1,*p2;
	#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
	#endif
	#ifdef DEBUG
	void pc(const char &c)
	{
		putchar(c);
	}
	#else
	char pbuf[1<<20],*pp=pbuf;
	void pc(const char &c)
	{
		if(pp-pbuf==1<<20)
			fwrite(pbuf,1,1<<20,stdout),pp=pbuf;
		*pp++=c;
	}
	struct IO{~IO(){fwrite(pbuf,1,pp-pbuf,stdout);}}_;
	#endif
	TP void read(T &x)
	{
		x=0;static int f;f=0;static char ch;ch=gc();
		for(;ch<'0'||ch>'9';ch=gc())ch=='-'&&(f=1);
		for(;ch>='0'&&ch<='9';ch=gc())x=(x<<1)+(x<<3)+(ch^48);
		f&&(x=-x);
	}
	TP void write(T x)
	{
		if(x<0)
			pc('-'),x=-x;
		static T sta[35],top;top=0;
		do
			sta[++top]=x%10,x/=10;
		while(x);
		while(top)
			pc(sta[top--]^48);
	}
	TP_ void read(T &x,T_&...y){read(x);read(y...);}
	TP void writeln(const T x){write(x);pc('\n');}
	TP void writesp(const T x){write(x);pc(' ');}
	TP_ void writeln(const T x,const T_ ...y){writesp(x);writeln(y...);}
	TP void debugsp(const T x){fprintf(stderr,"%d ",x);}
	TP void debug(const T x){fprintf(stderr,"%d\n",x);}
	TP_ void debug(const T x,const T_...y){debugsp(x);debug(y...);}
	TP inline T max(const T &a,const T &b){return a>b?a:b;}
	TP_ inline T max(const T &a,const T_&...b){return max(a,max(b...));} 
	TP inline T min(const T &a,const T &b){return a<b?a:b;}
	TP_ inline T min(const T &a,const T_&...b){return min(a,min(b...));}
	TP inline void swap(T &a,T &b){static T t;t=a;a=b;b=t;}
	TP inline T abs(const T &a){return a>0?a:-a;}
	#undef TP
	#undef TP_
}
using namespace IO;
using std::cerr;
using LL=long long;
constexpr int N=1e5+5,inf=1e9;
struct trnode
{
	int son[2],fa,siz,c;
	int tag;
}tr[N];int trlen,rt;
#define lc(x) tr[x].son[0]
#define rc(x) tr[x].son[1]
#define fa(x) tr[x].fa
void pushup(int x)
{
	tr[x].siz=tr[lc(x)].siz+tr[rc(x)].siz+1;
}
void add(int c,int fa)
{
	tr[++trlen]={0,0,fa,1,c,0};
	tr[fa].son[tr[fa].c<c]=trlen;
}
void pushdown(int x)
{
	if(tr[x].tag)
	{
		tr[lc(x)].tag^=1;
		tr[rc(x)].tag^=1;
		swap(lc(x),rc(x));
		tr[x].tag=0;
	}
}
void rotate(int x)
{
	int y=fa(x),z=fa(y);
	pushdown(y),pushdown(x);
	int k=(rc(y)==x);
	tr[z].son[rc(z)==y]=x;fa(x)=z;
	tr[y].son[k]=tr[x].son[k^1];fa(tr[x].son[k^1])=y;
	tr[x].son[k^1]=y;fa(y)=x;
	pushup(y),pushup(x);
}
void splay(int x,int root)
{
	while(fa(x)!=root)
	{
		int y=fa(x),z=fa(y);
		if(z!=root)
			((rc(y)==x)^(rc(z)==y))?rotate(x):rotate(y);
		rotate(x);
	}
	if(!root)
		rt=x;
}
int findkth(int k)
{
	int x=rt;
	while(1)
	{
		pushdown(x);
		if(k>tr[lc(x)].siz+1)
		{
			k-=tr[lc(x)].siz+1;
			x=rc(x);
		}
		else if(k<=tr[lc(x)].siz)
			x=lc(x);
		else
			return x;
	}
}
void turn(int l,int r)
{
	l=findkth(l);
	r=findkth(r+2);
	splay(l,0);
	splay(r,l);
	pushdown(rt);
	tr[lc(rc(rt))].tag^=1;
}
void output(int x)
{
	pushdown(x);
	if(lc(x))
		output(lc(x));
	if(tr[x].c!=inf&&tr[x].c!=-inf)
		writesp(tr[x].c);
	if(rc(x))
		output(rc(x));
}
int n,q,a[N];
int build(int fa,int l,int r)
{
	if(l>r)
		return 0;
	int mid=(l+r)>>1;
	add(a[mid],fa);
	int now=trlen;
	lc(now)=build(now,l,mid-1);
	rc(now)=build(now,mid+1,r);
	pushup(now);
	return now;
}
bool _End;
int main()
{
	//fprintf(stderr,"%.2 MBlf\n",(&_End-&_Start)/1048576.0);
	read(n,q);
	a[1]=-inf;
	for(int i=1;i<=n;i++)
		a[i+1]=i;
	a[n+2]=inf;
	rt=build(0,1,n+2);
	while(q--)
	{
		int l,r;
		read(l,r);
		turn(l,r);
	}
	output(rt);
	return 0;
}

标签:int,siz,tr,文艺,fa,平衡,now,define
From: https://www.cnblogs.com/lofty2007/p/18016343

相关文章

  • 【文化课学习笔记】【化学】选必一:水溶液中的离子反应与平衡(下)
    【化学】选必一:水溶液中的离子反应与平衡(下)盐类水解基本概念定义:盐电离出的离子与水电离出的\(\ce{H+}\)或\(\ce{OH-}\)相互作用生成弱电解质的反应。特点:可逆:水解是可逆反应,在一定条件下达到化学平衡。程度小:通常盐类水解程度很小,一般无沉淀析出、无气体放出。例......
  • 代码随想录算法训练营第十七天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶
    110.平衡二叉树 题目链接:110.平衡二叉树-力扣(LeetCode)思路:判断平衡二叉树,就是判断两个子树的高度差,继而问题转化为了如何求子树的高度——后序遍历(主要卡在了这里)。递归函数返回的是树的高度,同时用-1来表示退出递归(一开始想着用bool型作为返回值,发现函数不好设计)。同时要关......
  • 在Go中使用接口:实用性与脆弱性的平衡货币的精度
    在Go中使用接口:实用性与脆弱性的平衡原创 TimLiu 爱发白日梦的后端 2024-02-0307:00 发表于广东 听全文爱发白日梦的后端专注Go语言领域的发展,学习成为更牛逼的架构师,日常分享Go语言、架构、软件工具的使用。168篇原创内容公众号点击上方“名......
  • 平衡小车 高速运动时 紧急避障转弯继续运动的超声波传感器代码
    以下是一个使用超声波传感器实现平衡小车高速运动时紧急避障转弯继续运动的示例代码:#include<Wire.h>//定义超声波传感器引脚constinttrigPin=2;//触发引脚constintechoPin=3;//回声引脚//定义电机引脚constintmotorA1=9;constintmotorA2=10;const......
  • 平衡树
    能pbds写pbds无pbds写fhq#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e5+3;intrt,tot,lc[N],rc[N],val[N],rd[N],sz[N];#definelslc[p]#definersrc[p]voidUp(intp){sz[p]=sz[ls]+sz[rs]+1;}voidSpl(intp,int......
  • 通达信大盘平衡仪优化版指标公式源码
    {指标介绍:红色大盘指数安全,绿色大盘指数调整,红箭头超跌,绿箭头超涨,分析大盘不错的工具。}总家数:=INDEXADV+INDEXDEC;多:=INDEXADV;空:=INDEXDEC;差:=INDEXADV-INDEXDEC;起稳:=Ema(EMA(多,3),5);失衡:=EMA(EMA(EMA(空,4),4),2);生命:=EMA(MA(LLV(起稳,5),3),3);平衡差:=起......
  • 【文化课学习笔记】【物理】平衡力学
    【物理】平衡力学重力大小:\(G=m\mathrm{g}\);方向:竖直向下;\(\mathrm{g}\):不是定值,与高度和纬度有关;高度越高,\(\mathrm{g}\)越小;纬度越高,\(\mathrm{g}\)越大。重心:测量方法:悬挂法。规则图形的重心在几何中心。误区:重心不一定在物体上。注意事项:一个装满水的气球下方开......
  • 32_将有序数组转换为平衡二叉搜索树
    108、将有序数组转换为二叉搜索树给你一个整数数组nums,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树。高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过1」的二叉树。示例1:输入:nums=[-10,-3,0,5,9]输出:[0,-3,9,-10,nul......
  • P3391 文艺平衡树 题解
    QuestionP3391文艺平衡树写一种数据结构维护有序数列,需要完成以下操作:翻转一个区间,例如原有的序列是\(5,3,3,2,1\),翻转区间是\([2,4]\)的话,结果是\(5,2,3,4,1\)Solution这道题的表达是\(Splay\)但是\(Splay\)的代码实现比较困难,考虑使用FHQTreap。先思考如何将一......
  • Treap(平衡树)
    Treap前置芝士二叉搜索树(BST),见BST。平衡二叉树(AVL)。先来介绍一下平衡二叉树。背景BST出现以后,人们很快发现一个问题,当其维护一个有序序列时,很可能会退化成链。如图:这样的话,原来\(O(\log{n})\)的复杂度就退化为\(O(n)\),这是我们无法接受的,于是平衡二叉树横空出世......