MnZn刚学平衡树过不了样例求助
查看原帖
MnZn刚学平衡树过不了样例求助
378706
MoyunAllgorithm楼主2023/7/20 17:36
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
int pri[MAXN],val[MAXN],siz[MAXN],ls[MAXN],rs[MAXN],tag[MAXN],fa[MAXN],mn[MAXN];
int id[MAXN];
struct Element
{
	int x,y;
	bool operator<(const Element &j) const
	{
		return x==j.x?y<j.y:x<j.x;
	}
}a[MAXN];
int tot=0,rt=0,N,M;
inline int New(int x)
{
	pri[++tot]=rand();
	val[tot]=mn[tot]=x;
	siz[tot]=1;
	ls[tot]=rs[tot]=0;
	tag[tot]=0;
	return tot;
}
inline void PushUp(int p)
{
	siz[p]=siz[ls[p]]+siz[rs[p]]+1;
	mn[p]=val[p];
	if(ls[p]) mn[p]=min(mn[p],mn[ls[p]]);
	if(rs[p]) mn[p]=min(mn[p],mn[rs[p]]);
	return;
}
inline void PushDown(int p)
{
	if(tag[p])
	{
		swap(ls[p],rs[p]);
		if(ls[p]) tag[ls[p]]^=1;
		if(rs[p]) tag[rs[p]]^=1;
	}
	tag[p]=0;
	return;
}
inline void Split(int p,int k,int &x,int &y,int fax,int fay)
{
	if(p==0)
	{
		x=y=0;
		return;
	}
	PushDown(p);
	if(siz[ls[p]]<k)
	{
	//	fa[p]=fax;
		x=p;
		Split(rs[p],k-siz[ls[p]]-1,rs[p],y,p,fay);
	}
	else
	{
	//	fa[p]=fay;
		y=p;
		Split(ls[p],k,x,ls[p],fax,p);
	}
	PushUp(p);
}
inline int Merge(int p,int q)
{
	if(!p||!q) return p | q;
//	printf("%d %d\n",p,q);
	if (pri[p]<pri[q]) 
	{
		PushDown(p);
		rs[p]=Merge(rs[p],q);
		PushUp(p);return p;
	}
	PushDown(q);
	ls[q]=Merge(p,ls[q]);
	PushUp(q);return q;
}
int Rank(int p)
{
	int res=1;
	while(1)
	{
		PushDown(p);
	//	printf("%d %d %d %d %d\n",p,ls[p],mn[ls[p]],rs[p],mn[rs[p]]);
		if(ls[p]&&mn[ls[p]]==mn[p]) p=ls[p];
		else if(rs[p]&&mn[rs[p]]==mn[p]) p=rs[p],res+=siz[ls[p]]+1;
		else return res+siz[ls[p]];
	}
}
int ans[MAXN];
int main()
{
	srand(time(NULL));
	scanf("%d",&N);
	for(int i=1;i<=N;i++) 
	{
		scanf("%d",&a[i].x);
		a[i].y=i;
		id[a[i].y]=i;
	}
	sort(a+1,a+N+1);
	for(int i=1;i<=N;i++) ans[a[i].y]=i;
//	for(int i=1;i<=N;i++) printf("%d ",ans[i]);
	for(int i=1;i<=N;i++) 
	{
		rt=Merge(rt,New(ans[i]));
	//	puts("----");
	}
	for(int i=1;i<=N;i++) 
	{
		int k=Rank(rt);
		int ra,rb,rc;
		Split(rt,k,ra,rb,0,0);
		Split(ra,k-1,ra,rc,0,0);
		tag[ra]^=1;
		rt=Merge(ra,rb);
		printf("%d ",k+i-1);
	}
	puts("");
	return 0;
}
2023/7/20 17:36
加载中...