【Treap求助】所有数据都过了但是样例没过,是的你没有看错
查看原帖
【Treap求助】所有数据都过了但是样例没过,是的你没有看错
376467
QDHSLGYYJK楼主2021/3/24 14:17

是的,你没有看错,所有数据都过了但是样例没过xyx

过的记录

但是假如样例会输出3 3 1 5,第一行应该是2

感觉是函数GetRankByVal有问题,代码大概是参照李煜东的蓝书的,但是输出时write(GetRankByVal(root,x));而不是write(GetRankByVal(root,x)-1);书上写的大概是后面的

总的代码

#include<cstdio>
#include<ctime>
#include<cstdlib> 
using namespace std;
const int INF=2147483647;
void read(int &x){
	x=0;int f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9'){
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9'){
		x=x*10+(ch^48);
		ch=getchar();
	}
	x*=f;
}
void write(int x){
	if (x<0){
		putchar('-');
		x=-x;
	}
	if (x>9) write(x/10);
	putchar(x%10+'0');
}
struct node{
	int l,r,val,dat,cnt,siz;
	
};
node a[100005];
#define l(p) a[p].l
#define r(p) a[p].r
#define val(p) a[p].val
#define dat(p) a[p].dat
#define cnt(p) a[p].cnt
#define siz(p) a[p].siz
int root,tot;
int New(int val){
	++tot;
	val(tot)=val;
	dat(tot)=rand();
	cnt(tot)=siz(tot)=1;
	return tot;
}
void update(int p){
	siz(p)=siz(l(p))+siz(r(p))+cnt(p);
}
void Build(){
	root=New(INF);l(root)=New(-INF);
	update(root);
}
int GetRankByVal(int p,int val){
	if (p==0) return 0;
	if (val(p)==val) return siz(l(p))+1;
	if (val(p)>val) return GetRankByVal(l(p),val);
	return GetRankByVal(r(p),val)+siz(l(p))+cnt(p);
}
int GetValByRank(int p,int rank){
	if (p==0) return INF;
	if (siz(l(p))>=rank) return GetValByRank(l(p),rank);
	if (siz(l(p))+cnt(p)>=rank) return val(p);
	return GetValByRank(r(p),rank-siz(l(p))-cnt(p)); 
}
void zig(int &p){//右旋 
	int q=l(p);
	l(p)=r(q);r(q)=p;p=q;
	update(r(p));update(p);
}
void zag(int &p){//左旋 
	int q=r(p);
	r(p)=l(q);l(q)=p;p=q;
	update(l(p));update(p);
}
void Insert(int &p,int val){
	if (p==0){
		p=New(val);
		return;
	}
	if (val(p)==val){
		++cnt(p);
		update(p);
		return;
	}
	if (val(p)>val){
		Insert(l(p),val);
		if (dat(p)<dat(l(p))) zig(p); 
	}
	else{
		Insert(r(p),val);
		if (dat(p)<dat(r(p))) zag(p);
	}
	update(p);
}
int GetPre(int val){
	int ans=2;//val(2)=-INF 
	int p=root;
	while (p){
		if (val==val(p)){
			if (l(p)){
				p=l(p);
				while (r(p)) p=r(p);
				ans=p;
			}
			break;
		}
		if (val(p)<val&&val(p)>val(ans)) ans=p;
		p=val<val(p)?l(p):r(p);
	}
	return val(ans);
}
int GetNext(int val){
	int ans=1;//val(1)=INF 
	int p=root;
	while (p){
		if (val==val(p)){
			if (r(p)){
				p=r(p);
				while (l(p)) p=l(p);
				ans=p;
			}
			break;
		}
		if (val(p)>val&&val(p)<val(ans)) ans=p;
		p=val<val(p)?l(p):r(p);
	}
	return val(ans);
}
int main(){
	srand(unsigned(time(0)));
	int t,opt,x;
	read(t);
	Build(); 
	while (t--){
		read(opt);read(x);
		switch(opt){
			case 1:
				write(GetRankByVal(root,x));
				putchar('\n');
				break;
			case 2:
				write(GetValByRank(root,x+1));
				putchar('\n');
				break;
			case 3:
				write(GetPre(x));
				putchar('\n');
				break;
			case 4:
				write(GetNext(x));
				putchar('\n');
				break;
			case 5:
				Insert(root,x);
				break;
		}
	}
	return 0;
}
2021/3/24 14:17
加载中...