P3391 【模板】文艺平衡树 非旋转的treap解法

P3391 【模板】文艺平衡树

//非旋转treap 
#include<bits/stdc++.h>
using namespace std;
const int N=10e5+5;
int ch[N][2],tag[N],val[N],siz[N],key[N];
int tn,root,n,m;
inline void pushup(int x)
{
	siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;
}
inline void pushdown(int x)
{
	if (x&&tag[x])
	{
		tag[x]^=1;
		swap(ch[x][0],ch[x][1]);
		if (ch[x][0]) tag[ch[x][0]]^=1;
		if (ch[x][1]) tag[ch[x][1]]^=1;
	}
}
inline int makenode(int x)
{
	++tn;siz[tn]=1;val[tn]=x;key[tn]=rand();return tn;
}
inline int merge(int x,int y)
{
	if(!x||!y) return x+y;
	pushdown(x),pushdown(y);
	if (key[x]<key[y])
	{
		ch[x][1]=merge(ch[x][1],y);
		pushup(x);return x;
	}
	else
	{
		ch[y][0]=merge(x,ch[y][0]);
		pushup(y);return y;
	}
}
inline void split(int now,int k,int &x,int &y)
{
	if (!now) x=y=0;
	else{
		pushdown(now);
		if(k<=siz[ch[now][0]])
		{
			y=now;
			split(ch[now][0],k,x,ch[now][0]);
		}
		else
		{
			x=now;
			split(ch[now][1],k-siz[ch[now][0]]-1,ch[now][1],y);
		}
		pushup(now);
	}
}
inline void rever(int l,int r)
{
	int a,b,c,d;
	split(root,r,a,b);
	split(a,l-1,c,d);
	tag[d]^=1;
	root=merge(merge(c,d),b);
}
inline void Inorder(int x)
{
	if (!x) return ;
	pushdown(x);
	Inorder(ch[x][0]);
	cout<<val[x]<<" ";
	Inorder(ch[x][1]);
}
void pre(int x)
{
	if (!x) return;
	cout<<x<<",left"<<ch[x][0]<<",rihgt"<<ch[x][1]<<",size"<<siz[x]<<",val"<<val[x]<<endl;
	pre(ch[x][0]);
	pre(ch[x][1]);
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		root=merge(root,makenode(i));
	}
	//pre(root);
	while(m--)
	{
		int a,b;
		cin>>a>>b;
		rever(a,b);
	//	Inorder(root);
	//	cout<<endl;
	//	pre(root);
	}
	Inorder(root);
}

  

posted @ 2022-03-29 18:36  心悟&&星际  阅读(15)  评论(0编辑  收藏  举报