Splay TLE on #14,玄关
查看原帖
Splay TLE on #14,玄关
820574
time_keeper楼主2024/8/8 17:41

How to 优化

#include<bits/stdc++.h>
#define pp puts("A")
using namespace std;
const int N = 1e5 + 10;
struct node{
	node *l,*r,*fa;
	int sz,val;
}t[N],*root = t + 1;
node *vis[N],**top = vis;
void New(node *u){
	u->sz = 1;u->val = 0;
	u->l = u->r = u->fa = t;
}
bool ls(node *u){
	return u->fa->l==u;
}
void pushup(node *u){
	u->sz = 1 + u->l->sz + u->r->sz;
}
int Rank(int k,node *u = root){
	int ans = 0;
	while(u != t){
		if(k <= u->val) u = u->l;
		else ans += u->l->sz+1,u = u->r;
	}
	return ans;
}
node* find(int k,node *u = root){
	while(k != u->l->sz + 1){
		if(k < u->l->sz + 1) u = u->l;
		else k -= u->l->sz+1,u = u->r;
	}
	return u;
}
void rtt(node *u){
	node *f = u->fa,*g = f->fa;
	if(ls(u)){//如果是左儿子 
		f->l = u->r;
		if(f->l != t) f->l->fa=f;
		u->r=f;
	}else{
		f->r = u->l;
		if(f->r != t) f->r->fa=f;
		u->l=f;
	}
	f->fa=u;
	if(g != t){//如果f不是根 
		if(g->l==f) g->l=u;
		else g->r = u;
	}
	u->fa=g;
	pushup(f),pushup(u);
}
void splay(node *u,node *v){
	node *f = u->fa,*g = f->fa;
	if(v == t) root = u;
	while(u->fa != v){
		f = u->fa,g = f->fa;
		if(g != v){
			if(ls(u) == ls(f)) rtt(f);
			else rtt(u);
		}
		rtt(u);
	}
}
void insert(int x){
	int pos = Rank(x);
	node *l = find(pos),*r = find(pos + 1);node *u= *top;top--;
	splay(l,t),splay(r,l);
	New(u);u->val = x,u->fa = r,r->l=u;
	pushup(r),pushup(l);
}
void erase(int x){
	int pos = Rank(x);
	node *l = find(pos),*r = find(pos + 2);
	splay(l,t),splay(r,l);
	top++;*top=r->l;
	r->l = t;
	pushup(r),pushup(l);
}
int kth(int x){
	return find(x + 1)->val;
}
int pre(int x){
	return kth(Rank(x)-1);
}
int nxt(int x){
	return kth(Rank(x + 1));
}
int n;
int main(){
//	freopen("P3369_14.in","r",stdin);
//	freopen("out.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	New(t),t->sz = 0;
	New(t + 1),t[1].val = -1e9,t[1].r = t + 2,t[1].sz = 2;
	New(t + 2),t[2].val = 1e9,t[2].fa = t + 1,t[2].sz = 1;
	for(int i = 1;i < N;i++) ++top,*top=t + i;
	cin >> n;
	for(int i = 1;i <= n;i++){
		int opt,k;cin >> opt >> k;
		if(opt == 1) insert(k);
		if(opt == 2) erase(k);
		if(opt == 3) cout << Rank(k) << '\n';
		if(opt == 4) cout << kth(k) << '\n';
		if(opt == 5) cout << pre(k) << '\n';
		if(opt == 6) cout << nxt(k) << '\n';
	}
}

2024/8/8 17:41
加载中...