陋室空堂,当年RE满床;蛛丝儿结满雕梁,Splay今又WA在OJ上
查看原帖
陋室空堂,当年RE满床;蛛丝儿结满雕梁,Splay今又WA在OJ上
651786
yyc_楼主2023/3/19 11:55
#include<bits/stdc++.h>
#define ls s[0]
#define rs s[1]
#define getdir(u,v) (t[v].rs == u)
#define setson(u,c,v) t[u].s[c] = v,t[v].p = u
using namespace std;
const int maxn = 1e5+10;
struct node { int val,siz,cnt,s[2],p; }t[maxn];
int n,m,x,cnt,rt,l,r,tmp; char opt;
void pushup(int u) { u[t].siz = u[t].ls[t].siz + u[t].rs[t].siz + 1; }
void rota(int x) {
	int y = t[x].p,z = t[y].p, c = getdir(x,y);
	setson(z,getdir(y,z),x);
	setson(y,c,t[x].s[!c]);
	setson(x,!c,y);
	pushup(y),pushup(x);
}
void splay(int x,int k) {
	while(t[x].p != k) {
		int y = t[x].p,z = t[y].p;
		if(z != k) rota(getdir(x,y)^getdir(y,z) ? x : y);
		rota(x);
	} if(!k) rt = x;
}
int geturk(int u,int k) {
	while(1) {
		int less = t[u].ls[t].siz;
		if(k <= less) u = t[u].ls;
		else if(k <= less + t[u].cnt) { splay(u,0); return u;}
		else k -= less + t[u].cnt,u = t[u].rs;
	}
}
int getuval(int u,int val) {
	while(u) {
		if(t[u].val == val) return u;
		pushdown(u);
		u = t[u].s[val > t[u].val];
	}
	assert(0);
}
int merge(int u,int v) {
	if(!u || !v) return u|v;
	int maxon = geturk(u,t[u].siz);
	splay(maxon,0);
	setson(rt,1,v);
	pushup(rt);
	return rt;
}
void delu(int u) {
	splay(u,0);
	if(t[rt].cnt > 1) --t[rt].cnt;
	else {
		rt = merge(t[rt].ls,t[rt].rs);
		t[rt].p = 0;
	}
}
int insert(int &u,int p,int val) {
	if(!u) {
		u = ++cnt;
		t[u].p = p;
		t[u].cnt = t[u].siz = 1;
		t[u].val = val;
		return u;
	}
	if(t[u].val == val) {
		++t[u].cnt,++t[u].siz;
		return u;
	}
	int res = insert(t[u].s[t[u].val < val],u,val);
	pushup(u);
	return res;
}
void insert(int u,int val) { splay(insert(u,0,val),0); }
int getrk(int val) {
	int rk = 0,u = rt;
	while(u) {
		if(val == t[u].val) {
			rk += t[u].ls[t].siz;
			splay(u,0); return rk;
		}
		if(val < t[u].val) u = t[u].ls;
		else {
			rk += u[t].ls[t].siz + t[u].cnt;
			u = t[u].rs;
		}
	}
	return rk;
}
int getval(int u,int k) { int v = geturk(u,k); return t[v].val; }
void del(int u,int val) { int v = getuval(u,val); delu(v); }
signed main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n;
	while(n--) {
		cin>>opt>>x;
		switch(opt) {
			case '1': insert(rt,x); 						break;
			case '2': del(rt,x);							break;
			case '3': cout<<getrk(x)+1<<'\n';				break;
			case '4': cout<<getval(rt,x)<<'\n';				break;
			case '5': 
				tmp = getrk(x); cout<<getval(rt,tmp)<<'\n'; 				break;
			case '6': 
				tmp = getrk(x+1); cout<<getval(rt,tmp+1)<<'\n';
		}
	}
}

WA 6-10

2023/3/19 11:55
加载中...