gpt调的fhq-treap MLE20求助
查看原帖
gpt调的fhq-treap MLE20求助
289304
HAuCl4楼主2023/3/27 18:58

但是我数组已经足够小了……不知为啥。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=100005;
int rt=0,sz=0;
int v[N],w[N],s[N],lc[N],rc[N];
void up(int u)
{
	s[u]=s[lc[u]]+s[rc[u]]+1;
}
void split_w(int u,int w,int &x,int &y)
{
	if(!u) {x=y=0;return;}
	if(v[u]<=w) {x=u; split_w(rc[u],w,rc[u],y);}
	else {y=u; split_w(lc[u],w,x,lc[u]);}
	up(u);
}
void split_kth(int u,int k,int &x,int &y)
{
	if(!u) {x=y=0;return;}
	if(k<=s[lc[u]]){y=u; split_kth(lc[u],k,x,lc[u]);}
	else{x=u; split_kth(rc[u],k-s[lc[u]]-1,rc[u],y);}
	up(u);
}
int merge(int x,int y)
{
	if(!x||!y) return x+y;
	if(w[x]<w[y])
	{
		rc[x]=merge(rc[x],y);
		up(x); return x;
	}
	else
	{
		lc[y]=merge(x,lc[y]);
		up(y); return y;
	}
}
int new_node(int val)
{
	sz++;
	v[sz]=val; w[sz]=rand(); s[sz]=1;
	lc[sz]=rc[sz]=0;
	return sz;
}
void insert(int& rt,int v)
{
	int x,y;
	split_w(rt,v,x,y);
	rt=merge(merge(x,new_node(v)),y);
}
void del(int& rt,int v)
{
	int x,y,z;
	split_w(rt,v,x,y);
	split_w(x,v-1,y,z);
	y=merge(lc[y],rc[y]);
	rt=merge(merge(x,y),z);
}
int rk(int& rt,int v)
{
	int x,y,ans;
	split_w(rt,v-1,x,y);
	ans=s[x]+1;
	rt=merge(x,y);
	return ans;
}
int kth(int& rt,int k)
{
	int x,y,z;
	split_kth(rt,k,x,y);
	for(z=x;rc[z];z=rc[z]);
	rt=merge(x,y);
	return z;
}
int pre(int& rt,int v)
{
	int x,y,z;
	split_w(rt,v,x,y);
	for(z=x;rc[z];z=rc[z]);
	rt=merge(x,y);
	return z;
}
int suc(int& rt,int v)
{
	int x,y,z;
	split_w(rt,v,x,y);
	for(z=y;lc[z];z=lc[z]);
	rt=merge(x,y);
	return z;
}
int main()
{
	srand(time(0));
	int n,ta,x;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d%d",&ta,&x);
		switch(ta)
		{
			case 1: insert(rt,x); break;
			case 2: del(rt,x); break;
			case 3: printf("%d\n",rk(rt,x)); break;
			case 4: printf("%d\n",v[kth(rt,x)]);break;
			case 5: printf("%d\n",v[pre(rt,x)]);break;
			case 6: printf("%d\n",v[suc(rt,x)]);break;
		}	
	} 
	return 0;
}
2023/3/27 18:58
加载中...