萌新好奇,关于马蜂
  • 板块灌水区
  • 楼主Hencecho
  • 当前回复26
  • 已保存回复26
  • 发布时间2020/7/28 10:16
  • 上次更新2023/11/6 22:01:47
查看原帖
萌新好奇,关于马蜂
169480
Hencecho楼主2020/7/28 10:16
#include<bits/stdc++.h>
#define ls  T[now].son[0]
#define rs T[now].son[1]
using namespace std;
const double alp=1.0-sqrt(2)*0.5;
const double bta=(1.0-alp*2.0)/(1.0-alp);
const int Maxn=100005;
long long n;
struct dataa
{
	int si,va;
	int son[2];
}T[Maxn<<1];
int cnt=0;
int new_tree(int _v,int _s,int _l,int _r)
{
	int node=++cnt;
	T[node]=(dataa){_s,_v,_l,_r};
	return node;
}
int root=new_tree(0x3f3f3f3f,0,0,0);
void pushup(int now)
{
	if (ls==0) return ;
	T[now].si=T[ls].si+T[rs].si;
	T[now].va=T[rs].va;
	return ;
}
int finds(int now,int v)
{
	if (!ls) 
	{
		if (T[ls].va!=v) return -1;
		return now;
	}
	return finds(T[now].son[(v>T[ls].va)],v);
}
int Mix(int a,int b)
{
	int res=new_tree(0,0,0,0);
	T[res].son[0]=a;
	T[res].son[1]=b;
	pushup(res);
	return res;
}
void rot(int now,int q)
{
	if (!ls) return ;
	int nms=T[T[now].son[q]].son[q];
	if (q)
	ls=Mix(ls,T[rs].son[0]);else
	rs=Mix(T[ls].son[1],rs);
	T[now].son[q]=nms;
} 
void remain(int now)
{
	if (!ls) return ;
	int q=0;
	if  (T[ls].si<T[now].si*alp) q=1;
	else if  (T[rs].si<T[now].si*alp) q=0; 
	else return ;
	if (T[T[T[now].son[q]].son[q^1]].si>=T[T[now].son[q]].si*bta) rot(T[now].son[q],q^1);
	rot(now,q);
}
void ins(int &now,int v)
{
	if (!now) {now=new_tree(v,1,0,0);return ;}
	if (ls==0) ls=new_tree(min(v,T[now].va),1,0,0),rs=new_tree(max(v,T[now].va),1,0,0);
	else ins(T[now].son[T[ls].va<v],v);
	pushup(now),remain(now);
}
void del(int &now,int v)
{
	if (!now) return ;
	int p=bool(v>T[ls].va);
	if (!T[T[now].son[p]].son[0])
	{
		if (T[T[now].son[p]].va!=v) return ;
		T[now]=T[T[now].son[(p^1)]];
	} 
	del(T[now].son[p],v);
	pushup(now),remain(now);
}
int ran(int now,int v)
{
	if (!ls) return 1;
	int p=(v>T[ls].va);
	if (p==1) return ran(rs,v)+T[ls].si; else return ran(ls,v);
}
int kth(int now,int k)
{
	if (!T[now].son[0]) return T[now].va;
	if (T[ls].si<k) return kth(rs,k-T[ls].si);
	return kth(ls,k);
}
int main() 
{
	scanf("%d",&n);
	while(n--)
	{
		int s,a;
        scanf("%d%d",&s,&a);
        if(s==1) ins(root,a);
        if(s==2) del(root,a);
        if(s==3) printf("%d\n",ran(root,a));
        if(s==4) printf("%d\n",kth(root,a));
        if(s==5) printf("%d\n",kth(root,ran(root,a)-1));
        if(s==6) printf("%d\n",kth(root,ran(root,a+1)));
	}
    return 0;
}

比如平衡树模板的程序,求评价马蜂

2020/7/28 10:16
加载中...