无旋平衡术MLE
查看原帖
无旋平衡术MLE
726870
Rainber楼主2024/6/19 18:38
#include<stdio.h>
#include<time.h>
#define NMAX 100001
int left[NMAX],right[NMAX],size[NMAX],weight[NMAX],priority[NMAX],root,m=1;
void update_size(int p)
{
	p[size]=p[left][size]+p[right][size]+1;
}
void split_weight(int now,int w,int *x,int *y)
{
	if(now==0)
	{
		*x=*y=0;
		return;
	}
	if(now[weight]<=w) 
	{
		*x=now;
		split_weight(now[right],w,now+right,y);
	}
	else
	{
		*y=now;
		split_weight(now[left],w,x,now+left);
	}
	update_size(now);
}
void split_rank(int now,int rank,int *x,int *y)
{
	if(now==0)
	{
		*x=*y=0;
		return;
	}
	if(now[size]<=rank)
	{
		*x=now;
		split_weight(now[right],rank-now[size]-1,now+right,y);
	}
	else
	{
		*y=now;
		split_weight(now[left],rank,x,now+left);
	}
	update_size(now);
}
int merge(int x,int y)
{
	if(x==0||y==0)
	{
		return (x?y==0:y);
	}
	if(x[priority]<y[priority])
	{
		x[right]=merge(x[right],y);
		update_size(x);
		return x;
	}
	else
	{
		y[left]=merge(x,y[left]);
		update_size(y);
		return y;
	}
}
int max(int p)
{
	if(p[right]!=0)
	{
		return max(p[right]);
	}
	return p[weight];
}
int min(int p)
{
	if(p[left]!=0)
	{
		return max(p[left]);
	}
	return p[weight];
}
void solve1(int t)
{
	int x,y,z;
	m[left]=0;
	m[right]=0;
	m[size]=1;
	m[weight]=t;
	m[priority]=rand();
	split_weight(root,t,&x,&y);
	root=merge(merge(x,m),y);
	m++;
}
void solve2(int t)
{
	int x,y,z;
	split_weight(root,t,&x,&z);
	split_weight(x,t-1,&x,&y);
	root=merge(merge(x,merge(y[left],y[right])),z);
}
void solve3(int t)
{
	int x,y,z;
	split_weight(root,t,&x,&y);
	printf("%d\n",x[size]+1);
	merge(x,y);//
}
void solve4(int t)
{
	int x,y,z;
	split_rank(root,t,&x,&y);
	printf("%d\n",max(x));
	merge(x,y);//
}
void solve5(int t)
{
	int x,y,z;
	split_weight(root,t-1,&x,&y);
	printf("%d\n",max(x));
	merge(x,y);
}
void solve6(int t)
{
	int x,y,z;
	split_weight(root,t,&x,&y);
	printf("%d\n",min(y));
	merge(x,y);
}
int main()
{
	int n,i,r,t;
	scanf("%d",&n);
	for(i=0;i<n;++i)
	{
		scanf("%d%d",&r,&t);
		switch(r)
		{
			case 1:
				solve1(t);
				break;
			case 2:
				solve2(t);
				break;
			case 3:
				solve3(t);
				break;
			case 4:
				solve4(t);
				break;
			case 5:
				solve5(t);
				break;
			case 6:
				solve6(t);
				break; 
		};
	}
	return 0;
}

寄录

2024/6/19 18:38
加载中...