93pts求助
查看原帖
93pts求助
759196
Chu_awa_xing楼主2024/4/27 23:30

用的是splay的写法,但是第二个测试点WA了(恼

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
struct node{
	int s[2]; //s[0]代表左儿子 
	int parent,value,cnt,size;
	void init(int p,int v){
		parent=p,value=v;
		cnt=size=1;
	} 
}splay[1000005];
int root,idx;
void pushup(int u){
	splay[u].size=splay[splay[u].s[0]].size+splay[splay[u].s[1]].size+splay[u].cnt;
}
void rotate(int u){ //旋转 
	int y=splay[u].parent;
	int z=splay[y].parent;
	int k=splay[y].s[1]==u;
	
	splay[y].s[k]=splay[u].s[k^1];
	splay[splay[u].s[k^1]].parent=y;
	
	splay[u].s[k^1]=y;
	splay[y].parent=u;

	splay[z].s[splay[z].s[1]==y]=u;
	splay[u].parent=z;
	pushup(y),pushup(u);
}

//伸展splay
void sp(int u,int k){
	while(splay[u].parent!=k){ //当u为k的儿子时结束 
		int y=splay[u].parent;
		int z=splay[y].parent;
		if(z!=k){
			if((splay[y].s[0]==u)^(splay[z].s[0]==y)){ //双旋判断是直线型还是折线型 
				rotate(u);
			}
			else rotate(y);
		}
		rotate(u);
	}
	if(k==0) root=u;
} 
void find(int v){
	int u=root;
	while(splay[u].s[v>splay[u].value]&&v!=splay[u].value){
		u=splay[u].s[v>splay[u].value];
	}
	sp(u,0);
}
int query_front(int v){
	find(v);
	int u=root;
	if(splay[u].value<v) return u;
	u=splay[u].s[0];
	while(splay[u].s[1]){
		u=splay[u].s[1];
	}
	sp(u,0); 
	return u;
}
int query_end(int v){
	find(v);
	int u=root;
	if(splay[u].value>v) return u;
	u=splay[u].s[1];
	while(splay[u].s[0]){
		u=splay[u].s[0];
	}
	sp(u,0);
	return u;
}
void del(int v){
	int pre=query_front(v);
	int suc=query_end(v);
	sp(pre,0);
	sp(suc,pre);
	int del=splay[suc].s[0];
	if(splay[del].cnt>1){
		splay[del].cnt--;
		sp(del,0);
	}
	else{
		splay[suc].s[0]=0;
		sp(suc,0);
	}
}
int rnk(int v){
	find(v);
	return splay[splay[root].s[0]].size;
}
int rnk_val(int k){
	int u=root;
	while(1){
		int y=splay[u].s[0];
		if(splay[y].size+splay[u].cnt<k){
			k-=splay[y].size+splay[u].cnt;
			u=splay[u].s[1];
		}
		else{
			if(splay[y].size>=k){
				u=splay[u].s[0];
			}
			else break;
		}
	}
	sp(u,0);
	return splay[u].value;
}
int insert(int v){
	int u=root;
	int p=0;
	while(u&&splay[u].value!=v){
		p=u;
		u=splay[u].s[v>splay[u].value];
	}
	if(u){
		splay[u].cnt++;
	}
	else{
		u=++idx;
		splay[p].s[v>splay[p].value]=u;
		splay[u].init(p,v);
	}
	sp(u,0);
}
int main(){
	insert(-1e9),insert(1e9);//哨兵
	int n;
	cin>>n;
	while(n--){
		int op,x;
		cin>>op>>x;
		if(op==1) insert(x);
		else if(op==2) del(x);
		else if(op==3) cout<<rnk(x)<<endl;
		else if(op==4) cout<<rnk_val(x+1)<<endl;
		else if(op==5) cout<<splay[query_front(x)].value<<endl;
		else if(op==6) cout<<splay[query_end(x)].value<<endl;
	} 
	return 0;
}
2024/4/27 23:30
加载中...