权值线段树+动态开点 91WA#14 求调
查看原帖
权值线段树+动态开点 91WA#14 求调
558234
swa_0808楼主2023/11/20 15:42
#include <bits/stdc++.h>
using namespace std;

const int maxn=1e5+5;

int aa,len,root,ans,num,c[maxn],b[maxn],n,d[maxn<<1],lc[maxn<<1],rc[maxn<<1],op[maxn],a[maxn];

void Sol(){
	sort(b+1,b+1+n);
	len=unique(b+1,b+1+n)-b-1;
	for(int i=1;i<=n;i++)
		a[i]=lower_bound(b+1,b+1+len,a[i])-b;
}

void get_sum(int rt){
	d[rt]=d[lc[rt]]+d[rc[rt]];
}

void update1(int &p,int s,int t,int pos){
	if(!p)	p=++num;
	if(s==t){
		d[p]++;
		return;
	}
	int mid=s+t>>1;
	if(pos<=mid)	update1(lc[p],s,mid,pos);
	else		   update1(rc[p],mid+1,t,pos);
	get_sum(p);
}

void update2(int &p,int s,int t,int pos){
	if(!p)	p=++num;
	if(s==t){
		d[p]--;
		return;
	}
	int mid=s+t>>1;
	if(pos<=mid)	update2(lc[p],s,mid,pos);
	else			update2(rc[p],mid+1,t,pos);
	get_sum(p);
}

void ask1(int p,int s,int t,int l,int r){
	if(!p)	return ;
	if(l<=s && r>=t){
		ans+=d[p];
		return;
	}
	get_sum(p);
	int mid=s+t>>1;
	if(l<=mid)	ask1(lc[p],s,mid,l,r);
	if(r>mid)	ask1(rc[p],mid+1,t,l,r);
}

void ask2(int p,int s,int t,int pos){
	if(!p)	return ;
	if(s==t){
		printf("%d\n",b[s]);
		return;
	} 
	int mid=s+t>>1;
	get_sum(p);
	if(pos<=d[lc[p]])	ask2(lc[p],s,mid,pos);
	else				ask2(rc[p],mid+1,t,pos-d[lc[p]]);
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)	scanf("%d%d",&op[i],&a[i]),b[i]=a[i],c[i]=a[i];
	Sol();
	for(int i=1;i<=n;i++){
		if(op[i]==1)		update1(root,1,len,a[i]);
		else if(op[i]==2)	update2(root,1,len,a[i]);
		else if(op[i]==3)	ask1(root,1,len,1,a[i]-1),printf("%d\n",ans+1),ans=0;
		else if(op[i]==4)	ask2(root,1,len,c[i]);
		else if(op[i]==5)	ask1(root,1,len,1,a[i]-1),ask2(root,1,len,ans),ans=0;
		else{
			ask1(root,1,len,1,a[i]+1);
			aa=ans,ans=0;
			ask1(root,1,len,1,a[i]);
			if(aa==ans)	ask2(root,1,len,ans+1),ans=0;
			else		ask2(root,1,len,aa),ans=0;
		}			
	}
	return 0;
}
2023/11/20 15:42
加载中...