int update(int x)
{
if (x==0)
return 0;
标记下传;
}
int son(int x)
{
if (t[f[x]][0]==x)
return 0;
return 1;
}
int rotate(int x)
{
int y=f[x],z=son(x);
t[y][z]=t[x][1-z];
if (t[x][1-z]!=0)
f[t[x][1-z]]=y;
f[x]=f[y];
if (f[y]!=0)
t[f[y]][son(y)]=x;
f[y]=x,t[x][1-z]=y,update(y),update(x);
}
int down(int x)
{
下传标记;
清空;
}
int remove(int x,int y)
{
do d[++d[0]]=x,x=f[x];while (x!=y);
while (d[0])
down(d[d[0]--]);
}
int splay(int x,int y)
{
if (x==y)
return 0;
remove(x,y);
while (f[x]!=y)
{
if (f[f[x]]!=y)
if (son(f[x])==son(x))
rotate(f[x]);
else
rotate(x);
rotate(x);
}
if (y==0)
root=x;
}
int del(int x)
{
shan[0]++,shan[shan[0]]=x;
f[t[x][0]]=f[x];
t[f[x]][0]=t[x][0];
t[x][0]=0;
update(f[x]);
}
int kth(int x,int k)//第k大
{
if (b[t[x][0]].size+1==k)
return x;
if (b[t[x][0]].size+1>k)
return kth(t[x][0],k);
if (b[t[x][0]].size+1<k)
return kth(t[x][1],k-b[t[x][0]].size-1);
}
void overturn(int x)//翻转
{
if(!x)return;
swap(tt[x][0],tt[x][1]);
lazy[x]^=1;
}
int split(int x,int y,int &l,int &r)//分离
{
int j=kth(x,y);
splay(j,0);
l=j,r=t[j][1];
t[l][1]=0;
f[r]=0;
update(j);
}
int merge(int x,int y,int &l)//合并
{
int j=kth(x,size[x]);
splay(j,0);
t[j][1]=y;
f[y]=j;
update(j);
l=j;
}
int build(int l,int r,int y)
{
if(l>r)return 0;
int mid=(l+r)/2;
int x=insert(a[mid]),f[x]=y;
if(l==r)return x;
t[x][0]=build(l,mid-1,x);
t[x][1]=build(mid+1,r,x);
update(x);
return x;
}
root=build(0,n+1,0);
splay模板
最新推荐文章于 2021-04-08 16:23:25 发布