Splay求助 WA#4#5#8 RE#6#7
查看原帖
Splay求助 WA#4#5#8 RE#6#7
623636
Thomas0702楼主2023/8/12 17:31

思路: 先插入N本原来的书,类型为结构体value,rnk是代表排名的浮点数,s是书名
再插入M本书,其rnk取要插入位置的前后两本书的rnk的平均数,如果插入在0位置,就取原先0位置的rnk-1
最后根据rnk查询书名

#include<iostream>
using namespace std;
int N,M,Q,ind;
string a,s;
struct value{
	long double rnk;
	string s;
	value(){}
	value(long double _rnk,string _s):rnk(_rnk),s(_s){}
	friend bool operator>(value a,value b){return a.rnk>b.rnk;}
};
template<typename T> class SplayTree{
private:
	struct TreeNode{
		T val;
		int cnt,size;
		TreeNode *son[2],*fa;
	};
	TreeNode *root; 
public:
	SplayTree():root(NULL){}
private:
	void Update(TreeNode *u){
		u->size=u->cnt;
		if(u->son[0]!=NULL) u->size+=u->son[0]->size;
		if(u->son[1]!=NULL) u->size+=u->son[1]->size;
	}
	void Rotate(TreeNode *u){
		TreeNode *fa=u->fa,*gfa=fa->fa;
		if(gfa!=NULL) gfa->son[gfa->son[1]==fa]=u;
		else root=u;
		u->fa=gfa;
		int k=fa->son[1]==u;
		fa->son[k]=u->son[!k];
		if(u->son[!k]!=NULL) u->son[!k]->fa=fa;
		u->son[!k]=fa;
		fa->fa=u;
		Update(fa);
		Update(u); 
	}
	void Splay(TreeNode *u,TreeNode *v){
		while(u->fa!=v){
			TreeNode *fa=u->fa,*gfa=fa->fa;
			if(gfa!=v)
				(u==fa->son[0])==(fa==gfa->son[0])?Rotate(fa):Rotate(u);
			Rotate(u);
		}
	}
	TreeNode *kth(int k){
		TreeNode *u=root;
		while(u!=NULL){
			if(u->son[0]!=NULL&&u->son[0]->size>=k) u=u->son[0];
			else{
				k-=(u->son[0]==NULL?0:u->son[0]->size)+u->cnt;
				if(k<=0) break;
				u=u->son[1];
			}
		}
		if(u!=NULL) Splay(u,NULL);
		return u;
	}
public:
	void Insert(T x){
		if(root==NULL){
			root=new TreeNode;
			root->val=x;
			root->cnt=root->size=1;
			root->son[0]=root->son[1]=root->fa=NULL;
			return;
		}
		TreeNode *u=root,*fa=NULL;
		while(u!=NULL) fa=u,u=u->son[x>u->val];
		u=fa->son[x>fa->val]=new TreeNode;
		u->val=x;
		u->cnt=u->size=1;
		u->fa=fa;
		u->son[0]=u->son[1]=NULL;
		Splay(u,NULL);
	}
	T Getkth(int k){
		TreeNode *u=kth(k);
		return u->val;
	}
};
SplayTree<value> T;
int main(){
	cin>>N;
	for(int i=0;i<N;i++) cin>>a,T.Insert(value(i,a));
	cin>>M;
	for(int i=1;i<=M;i++){
		cin>>s>>ind;
		if(ind==0){
			long double x=T.Getkth(1).rnk;
			T.Insert(value(x-1,s));
		}else{
			long double x=T.Getkth(ind).rnk,y=T.Getkth(ind+1).rnk;
			T.Insert(value((x+y)/2,s));
		}
	}
	cin>>Q;
	while(Q--){
		cin>>ind;
		cout<<T.Getkth(ind+1).s<<"\n";
	}
    return 0;
}
/*

*/

希望各位大佬能指出本蒟蒻的错误QWQ

2023/8/12 17:31
加载中...