求大佬帮助
查看原帖
求大佬帮助
1149762
liujinxv123楼主2024/8/2 16:26

FHQ treap,样例通过,显示RE

#include <bits/stdc++.h>
using namespace std; 
const int M = 1e6 + 10;
int cnt = 0,root = 0;
struct node{
	int ls,rs;
	int key,pri;
	int size;
}t[M];
void newnode(int x){
	cnt ++;
	t[cnt].size = 1;
	t[cnt].ls = t[cnt].rs = 0;
	t[cnt].key = x;
	t[cnt].pri = rand();
} 
void update(int u){
	t[u].size = t[t[u].ls].size + t[t[u].rs].size + 1;
}
void split(int u,int x,int &L,int &R){
	if(!u){
		L = R = 0;
		return;
	}
	if(t[u].key <= x){
		L = u;
		split(t[u].rs,x,t[u].rs,R);
	}
	if(t[u].key > x){
		R = u;
		split(t[u].ls,x,L,t[u].ls);
	}
	update(u);
}
int merge(int l,int r){
	if(l == 0 || r == 0) return l + r;
	if(t[l].pri > t[r].pri){
		t[l].rs = merge(t[l].rs,r);
		update(l);
		return l;
	}else{
		t[r].ls = merge(l,t[r].ls);
		update(r);
		return r;
	}
}
int insert(int x){
	int l,r;
	split(root,x,l,r);
	newnode(x);
	int A = merge(l,cnt);
	root = merge(A,r);
}
int del(int x){
	int l,r,p;
	split(root,x,l,r);
	split(l,x - 1,l,p);
	p = merge(t[p].ls,t[p].rs);
	root = merge(merge(l,p),r);
}
void Rank(int x){
	int l,r;
	split(root,x - 1,l,r);
	cout << t[l].size + 1 << "\n";
	root = merge(l,r);
}
int kth(int u,int k){
	if(k <= t[t[u].ls].size) return kth(t[u].ls,k);
	if(k == t[t[u].ls].size + 1) return u;
	if(k > t[t[u].ls].size) return kth(t[u].rs,k - t[t[u].ls].size - 1);
}
void precursor(int x){
	int l,r;
	split(root,x - 1,l,r);
	cout << t[kth(l,t[l].size)].key << "\n";
	root = merge(l,r);
}
void successor(int x){
	int l,r;
	split(root,x,l,r);
	cout << t[kth(r,1)].key << "\n";
	root = merge(l,r);
}
int main(){
	int n;
	cin >> n;
	while(n --){
		int op,x;
		cin >> op >> x;
		if(op == 1) insert(x);
		if(op == 2) del(x);
		if(op == 3) Rank(x);
		if(op == 4) cout << t[kth(root,x)].key << "\n";
		if(op == 5) precursor(x);
		if(op == 6) successor(x);
	}
	return 0;
}
2024/8/2 16:26
加载中...