权值线段树动态开点MLE4个点求调
查看原帖
权值线段树动态开点MLE4个点求调
1011279
Naoxiaoyu楼主2024/3/3 15:55
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct tree{
	int sum,ls,rs;
}t[N*60];
int tot=1;
void change(int p,int l,int r,int x,int y)
{
	if(l==r)
	{
		t[p].sum+=y;
		return;
	}
	int mid=(l+r)/2;
	if(x<=mid) 
	{
		if(!t[p].ls) t[p].ls=++tot;
		change(t[p].ls,l,mid,x,y);
	}
	else 
	{
		if(!t[p].rs) t[p].rs=++tot;
		change(t[p].rs,mid+1,r,x,y);
	}
	t[p].sum=t[t[p].ls].sum+t[t[p].rs].sum;
}
int kth(int p,int l,int r,int x)
{
	if(l==r) return l;
	int mid=(l+r)/2;
	if(x<=t[t[p].ls].sum) 
	{
		//if(!t[p].ls) t[p].ls=++tot;
		return kth(t[p].ls,l,mid,x);
	}
	else 
	{
		//if(!t[p].rs) t[p].rs=++tot;
		return kth(t[p].rs,mid+1,r,x-t[t[p].ls].sum);
	}
}
int ask(int p,int l,int r,int x)
{
	if(r<=x-1) return t[p].sum;
	int mid=(l+r)/2;
	int ans=0;
	//if(!t[p].ls) t[p].ls=++tot;
	ans+=ask(t[p].ls,l,mid,x);
	if(x-1>=mid+1) 
	{
		//if(!t[p].rs) t[p].rs=++tot;
		ans+=ask(t[p].rs,mid+1,r,x);
	}
	return ans;
}
int findq(int p,int l,int r)
{
	if(l==r) return l;
	int mid=(l+r)/2;
	if(t[t[p].rs].sum) 
	{
		//if(!t[p].rs) t[p].rs=++tot;
		return findq(t[p].rs,mid+1,r);
	}
	//if(!t[p].ls) t[p].ls=++tot;
	return findq(t[p].ls,l,mid);
}
int findh(int p,int l,int r)
{
	if(l==r) return l;
	int mid=(l+r)/2;
	if(t[t[p].ls].sum) 
	{
		//if(!t[p].ls) t[p].ls=++tot;
		return findh(t[p].ls,l,mid);
	}
	//if(!t[p].rs) t[p].rs=++tot;
	return findh(t[p].rs,mid+1,r);
}
int qianqu(int p,int l,int r,int x)
{
	if(r<=x-1)
	{
		if(t[p].sum) return findq(p,l,r);
		return 0;
	}
	int mid=(l+r)/2;
	int re;
	if(mid+1<=x-1 && t[t[p].rs].sum && (re=qianqu(t[p].rs,mid+1,r,x)))
		return re;
	return qianqu(t[p].ls,l,mid,x);
}
int houji(int p,int l,int r,int x)
{
	if(x+1<=l)
	{
		if(t[p].sum) return findh(p,l,r);
		return 0;
	}
	int mid=(l+r)/2;
	int re;
	if(x+1<=mid && t[t[p].ls].sum && (re=houji(t[p].ls,l,mid,x)))
		return re;
	return houji(t[p].rs,mid+1,r,x);
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int opt,x;
		scanf("%d%d",&opt,&x);
		if(opt==1) change(1,1,1e7,x,1);
		else if(opt==2) change(1,1,1e7,x,-1);
		else if(opt==3) printf("%d\n",ask(1,1,1e7,x)+1);
		else if(opt==4) printf("%d\n",kth(1,1,1e7,x));
		else if(opt==5) printf("%d\n",qianqu(1,1,1e7,x));
		else printf("%d\n",houji(1,1,1e7,x));
	}
	return 0;
} 
2024/3/3 15:55
加载中...