LCT手写

LCT 42行模板。但是我主要凭记忆打的,没有对std,所以可能有的地方错了。回来要对一下std。

注意4个up,分别是rotate,splay,access,cut.

(uo维护链上信息,link不会合为一条链,所以不用up).

19,10,04.

#include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;++i)
#define LL long long
#define pf(a) printf("%d ",a)
#define phn puts("")
using namespace std;
#define lc ch[x][0]
#define rc ch[x][1]
int nroot(int x){return ch[f[x]][0]==x||ch[f[x]][1]==x;}
void pushr(int x){r[x]^=1;swap(lc,rc);}
void pushdown(int x){if(r[x]){if(lc)push(lc);if(rc)push(rc);r[x]=0;}}
void up(int x){w[x]=w[lc]+w[rc];}
void rotate(int x){
    int y=f[x],z=f[y],k=ch[y][1]==x,w=ch[x][!k];
    if(nroot(y))ch[z][ch[z][1]==y]=x;ch[y][k]=w;ch[w][!k]=y;
    if(w)f[w]=y;f[x]=z;f[y]=x; up(y);
}
void splay(int x){
    int y=x,z;sta[top=1]=x;
    while(nroot(y))sta[++top]=y=f[y];
    while(top)pushdown(sta[top--]);
    while(nroot(x)){
        y=f[x],z=f[y];
        if(nroot(y))rotate((ch[y][1]==x)^(ch[z][1]==y)?x:y);
        rotate(x);
    }up(x);
}
void access(int x){for(int y=0;x;x=f[y=x])splay(x),rc=y,up(x);}    
int findroot(int x){
    access(x);splay(x);
    while(lc)pushdown(x),x=lc; return x;
}
void makeroot(int x){access(x);splay(x);pushr(x);}    
void split(int x,int y){makeroot(x);access(y);splay(y);}
void link(int x,int y){
    makeroot(x);
    if(findroot(y)!=x)f[x]=y;
}
void cut(int x,int y){
    makeroot(x);
    if(findroot(y)==x&&f[y]==x&&!ch[y][0])f[y]=ch[x][1]=0;up(x);
}
int main(){

}
View Code

 

转载于:https://www.cnblogs.com/seamtn/p/11623405.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值