fhq treap刚刚学,查不出错,TLE+WA 28or36分,求助谢谢啦
查看原帖
fhq treap刚刚学,查不出错,TLE+WA 28or36分,求助谢谢啦
956071
Xiongzx楼主2023/3/13 12:14


#include <bits/stdc++.h>

#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define pre(i, a, b) for(int i = (a); i >= (b); i--)
#define Ede(i, u) for(int i = h[u]; i; i = ne[i])
#define go(i, a) for(auto i : a)
//#define int long long
#define LL long long
#define ULL unsigned long long
#define PII pair<int, int>
#define PIL pair<int, long long>
#define PLI pair<long long, int>
#define PLL pair<long long, long long>
#define mp make_pair
#define eb emplace_back
#define pb push_back
#define pf push_front
#define fi first
#define se second
#define sf scanf
#define prf printf
#define el putchar('\n')
#define mms(arr, n) memset(arr, n, sizeof(arr))
#define mmc(arr1, arr2) memcpy(arr1, arr2, sizeof(arr2))
const int inf = 0x3f3f3f3f;
//const int mod = ;

template <typename T> inline void rd(T &x){
	x = 0; bool f = true; char ch = getchar();
	while(ch < '0' || ch > '9'){ f = ((ch == '-') ? false : true); ch = getchar();}
	while(ch >= '0' && ch <= '9'){ x = (x << 1) + (x << 3) + (ch ^ '0'); ch = getchar();}
	if(!f) x = -x;
}
template <typename T, typename ...Args> inline void rd(T &x, Args &...args){ rd(x); rd(args...);}

using namespace std;

const int N = 1e5 + 10;
struct node{
	int l, r;
	int val, key, siz;
}tr[N]; 
int n, root, idx;

mt19937 eng(time(0));
uniform_int_distribution<int> ran(1, inf);
int newnode(int v){
	tr[++idx].val = v;
	tr[idx].key = ran(eng);
	tr[idx].siz = 1;
	return idx;
}
void pushup(int p){
	tr[p].siz = tr[tr[p].l].siz + tr[tr[p].r].siz + 1; 
}
void split(int p, int v, int &x, int &y){
	if(!p){ x = y = 0; return;}
	if(tr[p].val <= v){ x = p; split(tr[x].r, v, tr[x].r, y);}
	else{ y = p; split(tr[y].l, v, x, tr[y].l);}
	pushup(p);
} 
int merge(int x, int y){
	if(!x || !y) return x + y;
	if(tr[x].key < tr[y].key){ tr[x].r = merge(tr[x].r, y); pushup(x); return x;}
	else{ tr[y].l = merge(tr[y].l, x); pushup(y); return y;}
}
void insert(int v){
	int x, y, z;
	split(root, v, x, y);
	z = newnode(v);
	root = merge(merge(x, z), y);
}
void del(int v){
	int x, y, z;
	split(root, v, x, y);
	split(x, v - 1, x, z);
	z = merge(tr[z].r, tr[z].l);
	root = merge(merge(x, z), y);
}
int getk(int p, int k){
	if(k <= tr[tr[p].l].siz) return getk(tr[p].l, k);
	else if(k == tr[tr[p].l].siz + 1) return p;
	else return getk(tr[p].r, k - (tr[tr[p].l].siz + 1));
}
int getrk(int v){
	int x, y;
	split(root, v - 1, x, y);
	int rk = tr[x].siz + 1;
	root = merge(x, y); return rk;
}
int getval(int k){
 	int val = tr[getk(root, k)].val;
 	return val;
}
int getpre(int v){
	int x, y;
	split(root, v - 1, x, y);
	int pre = tr[getk(x, tr[x].siz)].val;
	root = merge(x, y); return pre;
}
int getne(int v){
	int x, y;
	split(root, v, x, y);
	int ne = tr[getk(y, 1)].val;
	root = merge(x, y); return ne;
}
int main(){
	/*
	freopen(".in", "r", stdin);
	freopen(".out", "w", stdout);
	*/
	rd(n);
	rep(i, 1, n){
		int ins, x; rd(ins, x);
		if(ins == 1){ //插入 
			insert(x);
		}else if(ins == 2){ //删除 
			del(x);
		}else if(ins == 3){ //查询x数排名 
			prf("test: %d\n", getrk(x));
		}else if(ins == 4){ //查询排名k的x 
			prf("test: %d\n", getval(x));
		}else if(ins == 5){ //前驱 
			prf("test: %d\n", getpre(x));
		}else if(ins == 6){ //后继 
			prf("test: %d\n", getne(x));
		}
	}
	return 0;
}




2023/3/13 12:14
加载中...