替罪羊树21分MLE+TLE求调教
查看原帖
替罪羊树21分MLE+TLE求调教
1344383
lixuean0408楼主2025/7/22 19:25

rt,马蜂不好,请见谅

#include <bits/stdc++.h>
using namespace std ;
typedef int ll ;
#define For(i,s,t)  for(ll i = s;i <= t;++ i)
#define RFor(i,s,t) for(ll i = s;i >= t;-- i)
const ll N = 1e5 + 5,ABS_X = 1e7 + 5 ;
struct node{ ll val,lp,rp,real,size ; bool used ; } t[N] ;
const double alpha = 0.75 ;
ll root,st[N],top,order[N] ;
void init_stack(){
	RFor(i,1e5,1)st[++ top] = i ;
	return ;
}
void init_data(node& a,ll x = 1e9){
	if(x != 1e9)a.val = x ;
	a.lp = a.rp = 0 ;
	a.real = a.size = a.used = 1 ;
	return ;
}
ll topGet(){ return st[top --] ; }
ll topPush(ll x){ return st[++ top] = x ; }
bool notbalanced(ll p){
	return t[p].size * alpha < double(max(t[t[p].lp].size,t[t[p].rp].size)) ; }
void push_up(ll p){
	const ll lp = t[p].lp,rp = t[p].rp ;
	t[p].real = t[p].size = 0 ;
	if(lp)t[p].real += t[lp].real,t[p].size += t[lp].size ;
	if(rp)t[p].real += t[rp].real,t[p].size += t[rp].size ;
	return ;
}
void inorder(ll p,ll& tot){
	if(!p)return ;
	inorder(t[p].lp,tot) ;
	if(t[p].used)order[++ tot] = p ;
	else topPush(p) ;
	inorder(t[p].rp,tot) ;
	return ;
}
ll build(ll l,ll r){
	if(l > r)return 0 ;
	if(l == r){ init_data(t[order[l]]) ; return l ; }
	ll mid = (l + r) >> 1,rt = order[mid] ;
	t[rt].lp = build(l,mid - 1),t[rt].rp = build(mid + 1,r) ;
	push_up(rt) ;
	return rt ;
}
void rebuild(ll& p){
	ll tot = 0 ;
	inorder(p,tot) ;
	p = tot ? build(1,tot) : 0 ;
	return ;
}
void insert(ll& p,ll x){
	if(!p){ init_data(t[p = topGet()],x) ; return ; }
	++ t[p].size,++ t[p].real ;
	if(x < t[p].val)insert(t[p].lp,x) ;
	else insert(t[p].rp,x) ;
	if(notbalanced(p))rebuild(p) ;
	return ;
}
ll rankGet(ll p,ll x){
	if(!p)return 0 ;
	if(x > t[p].val)return t[t[p].lp].real + t[p].used + rankGet(t[p].rp,x) ;
	return rankGet(t[p].lp,x) ;
}
ll kth(ll rank){
	ll p = root ;
	while(p)
		if(t[p].used && t[t[p].lp].real == rank)return p ;
		else if(t[t[p].lp].real >= rank)p = t[p].lp ;
		else rank -= t[t[p].lp].real + t[p].used,p = t[p].rp ;
	return p ;
}
void erase(ll p,ll val){
	-- t[p].real ;
	if(t[p].used == true && t[p].val == val){ t[p].used = false ; return ; }
	if(val >= t[p].val)erase(t[p].rp,val) ;
	else erase(t[p].lp,val) ;
	if(notbalanced(p))rebuild(p) ;
	return ;
}
ll biggest(ll x){
	ll xrk = rankGet(root,x) ;
	ll p = kth(xrk - 1) ;
	//if(!p || t[p].val >= x)return -1e9 ;
	return t[p].val ;
}
ll smallest(ll x){
	ll xrk = rankGet(root,x + 1) ;
	ll p = kth(xrk) ;
	return t[p].val ;
}
ll n,op,x ;
int main(){
	ios::sync_with_stdio(0) ; cin.tie(0) ;cout.tie(0);
	init_stack() ;
	cin >> n ;
	while(n --){
		cin >> op >> x ;
		switch(op){
			case 1 : insert(root,x) ; break ;
			case 2 : erase(root,x) ; break ;
			case 3 :
				cout << rankGet(root,x) + 1  << '\n' ;
				break ;
			case 4 :
				cout << t[kth(x - 1)].val  << '\n' ;
				break ;
			case 5 : cout << biggest(x)  << '\n' ;
				break ;
			case 6 : cout << smallest(x)  << '\n' ;
				break ;
		}
	}
	return 0 ;
}
2025/7/22 19:25
加载中...