P1177 【模板】快速排序 动态开点线段树题解


P1177 【模板】快速排序

//动态开点线段树,指针版 
#include
using namespace std;
const int maxn=100010;
typedef struct node{
	int cnt;
	node* ls;
	node* rs;
}node ;
node* root=NULL;
int cnt(node* rt)
{
	if (rt) return rt->cnt;
	return 0;
}
void pushup(node *rt)
{
	rt->cnt=cnt(rt->ls)+cnt(rt->rs);
}
void insert(node* &rt,int l,int r,int k)
{
	if (rt==NULL)
	{
		rt=new node;
		rt->cnt=0;
		rt->ls=NULL;
		rt->rs=NULL;
	}
	if (l==r)
	{
		rt->cnt++;
	}
	else
	{
		int mid=l+(r-l)/2;
		if (k<=mid)
		{
			insert(rt->ls,l,mid,k);
		}
		else
		{
			insert(rt->rs,mid+1,r,k);
		}
		pushup(rt);
	}
}
void inorder(node* rt,int l,int r)
{
	if (rt)
	{
		int mid=l+(r-l)/2; 
		inorder(rt->ls,l,mid);
		if (rt->ls==NULL&&rt->rs==NULL)
		{
			for (int i=1;i<=rt->cnt;++i) cout<rs,mid+1,r);
	}
}
int a[maxn];
int main()
{
	int n;
	int L,R;
	scanf("%d",&n);
	scanf("%d",&a[1]);
	L=R=a[1];
	for (int i=2;i<=n;i++)
	{
		scanf("%d",&a[i]);
		L=min(L,a[i]);
		R=max(R,a[i]);
	}
	for (int i=1;i<=n;i++)
	{
		insert(root,L,R,a[i]);
	}
	inorder(root,L,R);
}
/*
5
10 78 89 45 2
 
*/