思路:
先插入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