fhq平衡树求助!!!
  • 板块灌水区
  • 楼主exCat
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/7/20 17:09
  • 上次更新2024/7/20 18:50:05
查看原帖
fhq平衡树求助!!!
361932
exCat楼主2024/7/20 17:09

https://www.luogu.com.cn/record/167418203

第二个点下载后本地是对的,不知道怎么改。求各位大佬帮忙,悬关(附第二个点的数据)

#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int n,tot,root,ans,cnt;
struct node
{
	int siz,ls,rs,s,rnd;
}sh[N];
inline void update(int x)
{
	sh[x].siz=sh[sh[x].ls].siz+sh[sh[x].rs].siz+1;
	return ;
}
inline int add(int v)
{
    sh[++cnt].siz=1;
    sh[cnt].s=v;
    sh[cnt].rnd=rand();
    return cnt;
}
inline void split(int &x,int &y,int now,int k)
{
	if(!now)
	{
		x=y=0;
		return ;
	}
	if(sh[now].s<=k)
	{
		x=now;
		split(sh[x].rs,y,sh[now].rs,k);
	}
	else
	{
		y=now;
		split(x,sh[y].ls,sh[now].ls,k);
	}
	update(now);
}
inline int merge(int x,int y)
{
	if(!x||!y) return x|y;
	if(sh[x].rnd<sh[y].rnd)
	{
		sh[x].rs=merge(sh[x].rs,y);
		update(x);
		return x;
	}
	else
	{
		sh[y].ls=merge(sh[y].ls,x);
		update(y);
		return y;
	}
}
inline void insert(int k)
{
	int x,y;
	split(x,y,root,k);
	root=merge(merge(x,add(k)),y); 
	return ;
}
inline int queryrank(int v)
{
	int x,y;
	split(x,y,root,v-1);
	int ans=sh[x].siz+1;
	root=merge(x,y);
	return ans;
}
inline void del(int k)
{
	int x,y,z;
	split(x,y,root,k);
	split(x,z,x,k-1);
	z=merge(sh[z].ls,sh[z].rs);
	root=merge(merge(x,z),y);
	return ;
}
inline int querykth(int x,int k)
{
	if(sh[sh[x].ls].siz>=k)
		return querykth(sh[x].ls,k);
	else
	{
		if(sh[sh[x].ls].siz+1==k)return x;
		else return querykth(sh[x].rs,k-sh[sh[x].ls].siz-1);
	}
}
inline int querypre(int v)
{
	int l,r,ans;
	split(l,r,root,v-1);
	ans=sh[querykth(l,sh[l].siz)].s;
	root=merge(l,r);
	return ans;
}
inline int querysuf(int v)
{
	int l,r,ans;
	split(l,r,root,v);
	ans=sh[querykth(r,1)].s;
	root=merge(l,r);
	return ans;
}
int main()
{
	scanf("%d",&n);
	tot=root=0;
	for(int i=1;i<=n;i++)
	{
		int opt,x;
		scanf("%d%d",&opt,&x);
		if(opt==1)insert(x);
		if(opt==2)del(x);
		if(opt==3)printf("%d\n",queryrank(x));
		if(opt==4)printf("%d\n",sh[querykth(root,x)].s);
		if(opt==5)printf("%d\n",querypre(x));
		if(opt==6)printf("%d\n",querysuf(x));
	}
	return 0;
}
/*
输入:
5
1 24
1 25
1 20
3 23
3 23
输出:
2
2
*/ 
2024/7/20 17:09
加载中...