关于动态开点线段树
  • 板块学术版
  • 楼主for_cat
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/6/23 22:43
  • 上次更新2024/6/24 13:15:16
查看原帖
关于动态开点线段树
758472
for_cat楼主2024/6/23 22:43

萌新第一次写动态开点线段树,不知道这样写可不可以qwq

int root[N],rem[N];
struct sgt{
	int sum,ls,rs;
}d[100*N];
int cntt=0;
void erase(int &x,int l,int r,int v){
	if(x==0){
		if(rem[0]){
			x=rem[rem[0]];
			rem[0]--;	
		}
		else{
			cntt++; 
			x=cntt;
		}
	}
	if(l==r){
		if(d[x].sum==1){
			d[x].sum--;
		}
		if(d[x].sum==0){
			rem[++rem[0]]=x;
			x=0;
		} 
		return ;
	}
	int mid=(l+r)/2;
	if(v<=mid){
		erase(d[x].ls,l,mid,v);
	}
	else{
		erase(d[x].rs,mid+1,r,v);
	}
	d[x].sum=d[d[x].ls].sum+d[d[x].rs].sum;
	if(d[x].sum==0){
		rem[++rem[0]]=x;
		x=0;
	}
}
void insert(int x,int l,int r,int v){
	if(x==0){
		if(rem[0]){
			x=rem[rem[0]];
			rem[0]--;
		}
		else{
			cntt++; 
			x=cntt;
		}
	}
	if(l==r){
		d[x].sum++;
		return ;
	}
	int mid=(l+r)/2;
	if(v<=mid){
		insert(d[x].ls,l,mid,v);
	}
	else{
		insert(d[x].rs,mid+1,r,v);
	}
	d[x].sum=d[d[x].ls].sum+d[d[x].rs].sum;
}
2024/6/23 22:43
加载中...