社区讨论

treap WA on #1#2

P3369【模板】普通平衡树参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lujz9qii
此快照首次捕获于
2024/04/03 23:43
2 年前
此快照最后确认于
2024/04/04 10:59
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10,inf=1145141919810ll;
struct mytreep{
	struct node{
		int son[2],v,siz,rd,num;
	}t[N];
	int root,pcnt;
	void push_up(int p){
		t[p].siz=t[p].num+t[t[p].son[0]].siz+t[t[p].son[1]].siz;
	}
	void move(int &p,int d){
		int k=t[p].son[d^1];
		t[p].son[d^1]=t[k].son[d];
		t[k].son[d]=p;
		push_up(p);
		push_up(k);
		p=k;
	}
	void insert(int &p,int x){
		if(p==0){
			p=++pcnt;
			t[p].num=1;
			t[p].v=x;
			t[p].siz=1;
			t[p].rd=rand();
			return ;
		}
		if(t[p].v==x){
			t[p].num++;
			t[p].siz++;
			return ;
		}
		int d=t[p].v<x;
		insert(t[p].son[d],x);
		if(t[t[p].son[d]].rd>t[p].rd)move(p,d^1);
		push_up(p);
	}
	void erase(int &p,int x){
		if(p==0)return ;
		else if(x<t[p].v)erase(t[p].son[0],x);
		else if(x>t[p].v)erase(t[p].son[1],x);
		else{
			if(!t[p].son[0]&&!t[p].son[1]){
				t[p].siz--;t[p].num--;
				if(t[p].num==0)p=0;
			}
			else if(t[p].son[0]&&!t[p].son[1]){
				move(p,1);erase(t[p].son[1],x);
			}
			else if(!t[p].son[0]&&t[p].son[1]){
				move(p,0);erase(t[p].son[0],x);
			}
			else{
				int d=t[t[p].son[1]].rd<t[t[p].son[0]].rd;
				move(p,d);erase(t[p].son[d],x);
			}
		}
		push_up(p);
	}
	int rank(int &p,int x){
		if(p==0)return 0;
		if(t[p].v==x)return t[t[p].son[0]].siz+1;
		if(x>t[p].v)return t[t[p].son[0]].siz+t[p].num+rank(t[p].son[1],x);
		return rank(t[p].son[0],x);
	}
	int find(int &p,int x){
		if(p==0)return 0;
		if(t[t[p].son[0]].siz>=x)return find(t[p].son[0],x);
		if(x>t[t[p].son[0]].siz+t[p].num)return find(t[p].son[1],x-t[t[p].son[0]].siz-t[p].num);
		return t[p].v;
	}
	int pre(int &p,int x){
		if(p==0)return -inf;
		if(t[p].v>=x)return pre(t[p].son[0],x);
		return max(t[p].v,pre(t[p].son[1],x));
	}
	int suc(int &p,int x){
		if(p==0)return inf;
		if(t[p].v<=x)return suc(t[p].son[1],x);
		return min(t[p].v,suc(t[p].son[0],x));
	}
}met;
int n;
signed main(){
	cin>>n;
	while(n--){
		int op,x;scanf("%lld%lld",&op,&x);
		if(op==1){
			met.insert(met.root,x);
		}
		if(op==2){
			met.erase(met.root,x);
		}
		if(op==3){
			cout<<met.rank(met.root,x)<<"\n";
		}
		if(op==4){
			cout<<met.find(met.root,x)<<"\n";
		}
		if(op==5){
			cout<<met.pre(met.root,x)<<"\n";
		}
		if(op==6){
			cout<<met.suc(met.root,x)<<"\n";
		}
	}
	return 0;
} 
完全看不出来错误在哪,求调

回复

0 条回复,欢迎继续交流。

正在加载回复...