Treap #5~#11TLE
查看原帖
Treap #5~#11TLE
757040
MuLinnnnn楼主2024/4/27 12:38

求调!!!

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll RandMod = 19260817;
const ll INF = 1e9;

struct Treap{
	ll data, value;
	ll l, r;
	ll size;
}T[100003];
ll cnt, root;

inline void Update(ll o){
	T[o].size = T[T[o].l].size + T[T[o].r].size + 1;
	return ;
}

void RightRotate(ll &now){
	ll L = T[now].l;
	T[now].l = T[L].r;
	T[L].r = now;
	T[L].size = T[now].size;
	Update(now);
	now = L;
	return ;
}

void LeftRotate(ll &now){
	ll R = T[now].r;
	T[now].r = T[R].l;
	T[R].l = now;
	T[R].size = T[now].size;
	Update(now);
	now = R;
	return ;
}

void insert(ll &now, ll data){
	if(now == 0){
		now = ++cnt;
		T[now].size = 1;
		T[now].data = data;
		T[now].value = rand() * rand() % RandMod;
		return ;
	}
	++T[now].size;
	if(data >= T[now].data){
		insert(T[now].r, data);
	}else{
		insert(T[now].l, data);
	}
	if(T[now].l != 0 && T[now].value > T[T[now].l].value){
		RightRotate(now);
	}
	if(T[now].r != 0 && T[now].value > T[T[now].r].value){
		LeftRotate(now);
	}
	Update(now);
	return ;
}

void Del(ll &now, ll data){
	T[now].size--;
	if(T[now].data == data){
		if(T[now].l == 0 && T[now].r == 0){
			now = 0;
			return ;
		}
		if(T[now].l == 0 || T[now].r == 0){
			now = T[now].l + T[now].r;
			return ;
		}
		if(T[T[now].l].value < T[T[now].r].value){
			RightRotate(now);
			Del(T[now].r, data);
			return ;
		}else{
			LeftRotate(now);
			Del(T[now].l, data);
			return ;
		}
	}
	if(T[now].data >= data){
		Del(T[now].l, data);
	}else{
		Del(T[now].r, data);
	}
	Update(now);
	return ;
}

ll Rank(ll now, ll data){
	if(now == 0){
		return 0;
	}
	if(data > T[now].data){
		return T[T[now].l].size + 1 + Rank(T[now].r, data);
	}
	return Rank(T[now].l, data);
}

ll Find(ll now, ll rank){
	if(rank == T[T[now].l].size + 1){
		return T[now].data;
	}
	if(rank > T[T[now].r].size + 1){
		return Find(T[now].r, rank - T[T[now].l].size - 1);
	}
	return Find(T[now].l, rank);
}

ll QueryPre(ll now, ll data){
	if(now == 0){
		return 0;
	}
	if(T[now].data >= data){
		return QueryPre(T[now].l, data);
	}
	ll R = QueryPre(T[now].r, data);
	if(R == 0){
		return T[now].data;
	}
	return R;
}

ll QuerySuf(ll now, ll data){
	if(now == 0){
		return 0;
	}
	if(T[now].data <= data){
		return QuerySuf(T[now].r, data);
	}
	ll L = QuerySuf(T[now].l, data);
	if(L == 0){
		return T[now].data;
	}
	return L;
}

int main(){
	srand(19260817);
	ll n;
	cin >> n;
	for(ll i = 1; i <= n; ++i){
		ll opt, data;
		cin >> opt >> data;
		if(opt == 1){
			insert(root, data);
		}else if(opt == 2){
			Del(root, data);
		}else if(opt == 3){
			cout << Rank(root, data) + 1 << endl;
		}else if(opt == 4){
			cout << Find(root, data) << endl;
		}else if(opt == 5){
			cout << QueryPre(root, data) << endl;
		}else if(opt == 6){
			cout << QuerySuf(root, data) << endl;
		}
	}
	return 0;
}

卡死我了qwq

2024/4/27 12:38
加载中...