Splay求调玄关,输出不见了!
查看原帖
Splay求调玄关,输出不见了!
611878
sunqihuan楼主2024/12/11 07:32

真是一个玄学。

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n,m,root,idx,delta;
struct node{
	int s[2],p,v,size;
	void init(int tv,int tp){
		v=tv;
		p=tp;
		size=1;
	}
}tr[N]; 
void pushup(int x){
	tr[x].size=tr[tr[x].s[0]].size+tr[tr[x].s[1]].size+1;
}
void rotate(int x){
	int y=tr[x].p,z=tr[y].p;
	int k=tr[y].s[1]==x;
	tr[z].s[tr[z].s[1]==y]=x,tr[x].p=z;
	tr[y].s[k]=tr[x].s[k^1],tr[tr[x].s[k^1]].p=y;
	tr[x].s[k^1]=y,tr[y].p=x;
	pushup(y);
	pushup(x);
}
void splay(int x,int k){
	while(tr[x].p!=k){
		int y=tr[x].p,z=tr[y].p;
		if(z!=k){
			if((tr[y].s[1]==x)^(tr[z].s[1]==y))rotate(x);
			else rotate(y);
		}
		rotate(x);
	}
	if(!k)root=x;
}
int insert(int v){
	int u=root,p=0;
	while(u)p=u,u=tr[u].s[v>tr[u].v];
	u=++idx;
	if(p)tr[p].s[v>tr[p].v]=u;
	tr[u].init(v,p);
	splay(u,0);
	return u;
}
int get_k(int k){
	int u=root;
	while(1){
		if(tr[tr[u].s[0]].size>=k)u=tr[u].s[0];
		else if(tr[tr[u].s[0]].size+1==k)return tr[u].v;
		else k-=tr[tr[u].s[0]].size+1,u=tr[u].s[1];
	}
	return -1;
}
int get(int v){
	int u=root,res;
	while(u){
		if(tr[u].v>=v)res=u,u=tr[u].s[0];
		else u=tr[u].s[1];
	}
	return res;
}
int main(){
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
	cin>>n>>m;
	int L=insert(-1e9),R=insert(1e9),tot=0;
	while(n--){
		char op[10];
		int k;
		cin>>op[0]>>k;
		if(op[0]=='I')if(k>=m)/*cout<<"#",*/k-=delta,insert(k),tot++;
		else if(op[0]=='A')/*cout<<"$",*/k+=delta;
		else if(op[0]=='S'){
//			cout<<"^";
			delta-=k;
			R=get(m-delta);
			splay(R,0);
			splay(L,R);
			tr[L].s[1]=0;
			pushup(L);
			pushup(R);
		}else{
//			cout<<"&";
			if(tr[root].size-2<k)cout<<"-1"<<endl;
			else cout<<get_k(tr[root].size-k)+delta<<endl;
		}
	}
	cout<<tot-(tr[root].size+2)<<endl;
	return 0;
}


2024/12/11 07:32
加载中...