快了快了 我的线段树快要a掉平衡树模板了
  • 板块灌水区
  • 楼主a1589255859
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/4/4 22:41
  • 上次更新2023/11/5 01:01:53
查看原帖
快了快了 我的线段树快要a掉平衡树模板了
95780
a1589255859楼主2021/4/4 22:41
#include<bits/stdc++.h>
#define ls x*2
#define rs x*2+1
#define mid (tree[x].l+tree[x].r)/2
#define fa (x+1)/2
using namespace std;
map<int,int>m;
int n,p,u[100005][2];
int q[100005];
struct node{
	int l,r;
	int num1,num2;
	int mi,ma;
	int tot;
}tree[300005];
int build(int x,int l,int r)
{
	tree[x].l=l;tree[x].r=r;
	if(l==r)
	{
		tree[x].num1=tree[x].num2=q[r];
		return q[r];
	}
	tree[x].num1=build(x*2  ,l    ,mid);
	tree[x].num2=build(x*2+1,mid+1,r  );
	return tree[x].num2;
}
void ins(int k,int x)
{
	tree[x].tot++;
	if(tree[x].l==tree[x].r)
	{
		tree[x].mi=tree[x].ma=tree[x].num1;
		return;
	}
	if(k>tree[x].num1)
	{
		ins(k,rs);
		tree[x].ma=tree[rs].ma;
		if(!tree[ls].tot)tree[x].mi=tree[rs].mi;
	}
	else 
	{
		ins(k,ls);
		tree[x].mi=tree[ls].mi;
		if(!tree[rs].tot)tree[x].ma=tree[ls].ma;
	}
	return;
}
void del(int k,int x)
{
	tree[x].tot--;
	if(tree[x].l==tree[x].r)
	{
		if(!tree[x].tot)
		tree[x].mi=tree[x].ma=0;
		return;
	}
	if(k>tree[x].num1)
	{
		del(k,rs);
		if(!tree[rs].tot)
		{
			tree[x].ma=tree[ls].ma;
			tree[x].mi=tree[ls].mi;
		}
	}
	else 
	{
		del(k,ls);
		if(!tree[ls].tot)
		{
			tree[x].ma=tree[rs].ma;
			tree[x].mi=tree[rs].mi;
		}
	}
	return;
}
int rk(int k,int x)
{
	if(tree[x].l==tree[x].r)return 0;
	if(k>tree[x].num1)return rk(k,rs)+tree[ls].tot;
	else return rk(k,ls);
}
int kth(int k,int x)
{
	if(tree[x].l==tree[x].r)return tree[x].num1;
	if(k<=tree[ls].tot)return kth(k,ls);
	else return kth(k-tree[ls].tot,rs);
}
int pre(int k,int x)
{
	//cout<<tree[x].ma<<" "<<tree[x].mi<<" "<<x<<endl;
	if(tree[x].l==tree[x].r)return tree[x].num1;
	if((!tree[rs].tot)||k<=tree[rs].mi)return pre(k,ls);
	else return pre(k,rs);
}
int nxt(int k,int x)
{
	if(tree[x].l==tree[x].r)return tree[x].num1;
	if((!tree[ls].tot)||k>=tree[ls].ma)return nxt(k,rs);
	else return nxt(k,ls);
}
int main()
{
	cin>>n;
	for(register int i=1;i<=n;++i)
	{
		scanf("%d%d",&u[i][1],&u[i][2]);
		if(u[i][1]==1)
		{
			if(!m[u[i][2]])q[++p]=u[i][2],m[u[i][2]]=1;
		}
	}
	sort(q+1,q+p+1);
	build(1,1,p);
	//for(int i=1;i<=3;++i)cout<<tree[i].ma<<" "<<tree[i].mi<<endl;
	for(register int i=1;i<=n;++i)
	{
		switch(u[i][1])
		{
			case 1:ins(u[i][2],1);break;
			case 2:del(u[i][2],1);break;
			case 3:printf("%d\n",rk(u[i][2],1)+1);break;
			case 4:printf("%d\n",kth(u[i][2],1));break;
			case 5:printf("%d\n",pre(u[i][2],1));break;
			case 6:printf("%d\n",nxt(u[i][2],1));break;
		}
	}
	//for(int i=1;i<=3;++i)cout<<tree[i].ma<<" "<<tree[i].mi<<endl;

	/*for(int i=1;i<=5;++i)
	printf("%d %d %d %d %d\n",tree[i].l,tree[i].r,tree[i].num1,tree[i].num2,tree[i].tot);*/
	return 0;
}

目前52分 都是WA

P3369

2021/4/4 22:41
加载中...