平衡树全WA 样例能过 求助
查看原帖
平衡树全WA 样例能过 求助
469066
zzxLLL楼主2021/10/3 12:09

代码如下

#include<bits/stdc++.h>
using namespace std;
unsigned long long zzx=2020150;
int rdm(){
	return (zzx*=23333)%2147483647;
}
const int M=1e5+10;
struct node{
	int lc,rc,pri,val;
	node(int l=0,int r=0,int p=0,int v=0):lc(l),rc(r),pri(p),val(v){}
}tr[M];
int root,cntp;
int newval(int val){
	tr[++cntp]=node(0,0,rdm(),val);
	return cntp;
}
void zig(int &p){
	int q=tr[p].lc;
	tr[p].lc=tr[q].rc;
	tr[q].rc=p;
	p=q;
}
void zag(int &p){
	int q=tr[p].rc;
	tr[p].rc=tr[q].lc;
	tr[q].lc=p;
	p=q;
}
void insert(int &p,int val){
	if(!p){
		p=newval(val);
		return;
	}
	if(tr[p].val==val){
		printf("Already Exist\n");
		return;
	}
	if(val<tr[p].val){
		insert(tr[p].lc,val);
		if(tr[tr[p].lc].pri>tr[p].pri) zig(p);
	}else{
		insert(tr[p].rc,val);
		if(tr[tr[p].rc].pri>tr[p].pri) zag(p);
	}
}
void remove(int &p,int val){
	if(!p) return;
	if(tr[p].val==val){
		if(!tr[p].lc||!tr[p].rc) p=tr[p].lc=tr[p].rc;
		else if(tr[tr[p].lc].pri>tr[tr[p].rc].pri){
			zig(p);
			remove(tr[p].rc,val);
		}else{
			zag(p);
			remove(tr[p].lc,val);
		}
		return;
	}
	if(tr[p].val>val) remove(tr[p].lc,val);
	else remove(tr[p].rc,val);
}
int pre(int val){
	int cur=root,res=0;
	while(cur)
		if(tr[cur].val<val){
			res=tr[cur].val;
			cur=tr[cur].rc;
		}else cur=tr[cur].lc;
	return res;
}
int suf(int val){
	int cur=root,res=0;
	while(cur)
		if(tr[cur].val>val){
			res=tr[cur].val;
			cur=tr[cur].lc;
		}else cur=tr[cur].rc;
	return res;
}
bool count(int val){
	int cur=root;
	while(cur)
		if(tr[cur].val==val) return true;
		else if(tr[cur].val>val) cur=tr[cur].lc;
		else cur=tr[cur].rc;
	return false;
}
void print(int p){
	if(tr[p].lc) print(tr[p].lc);
	printf("%d ",tr[p].val);
	if(tr[p].rc) print(tr[p].rc);
}
int n,s,p;
int main(){
	scanf("%d",&n);
	for(int i=1,opt,x;i<=n;i++){
		scanf("%d%d",&opt,&x);
		switch(opt){
			case 1:insert(root,x);break;
			case 2:
				if(count(x)){
					printf("%d\n",x);
					remove(root,x);
					break;
				}
				s=suf(x),p=pre(x);
				if(p!=0&&(x-p>=s-x||s==0)) printf("%d\n",p),remove(root,p);
				else if(s!=0) printf("%d\n",s),remove(root,s);
				else printf("Empty\n");
				
			default:break;
		}
		//print(root);putchar('\n');
	}
	return 0;
}

调吐了 求大佬帮忙

2021/10/3 12:09
加载中...