posted on 2022-08-17 18:05:59 | under 模板 | source

template<int N> struct lctree{
	int val[N+10],sum[N+10],fa[N+10],ch[N+10][2],rev[N+10];
	bool getson(int p){return ch[fa[p]][1]==p;}
	bool isroot(int p){return !p||ch[fa[p]][getson(p)]!=p;}
	void maintain(int p){sum[p]=val[p]^sum[ch[p][0]]^sum[ch[p][1]];}
	void pushdown(int p){if(rev[p]) swap(ch[p][0],ch[p][1]),rev[ch[p][0]]^=1,rev[ch[p][1]]^=1,rev[p]^=1;}
	void update(int p){if(!isroot(p)) update(fa[p]); pushdown(p);}
	void connect(int p,int q,int r){fa[p]=q,ch[q][r]=p;}//p->q
	void rotate(int p){int f=fa[p],r=getson(p);if(fa[p]=fa[f],!isroot(f)) connect(p,fa[f],getson(f));connect(ch[p][r^1],f,r),connect(f,p,r^1),maintain(f),maintain(p);}
	void splay(int p){for(update(p);!isroot(p);rotate(p)) if(!isroot(fa[p])) rotate(getson(p)==getson(fa[p])?fa[p]:p);}
	int access(int p){int y=0;for(;p;p=fa[y=p]) splay(p),ch[p][1]=y,maintain(p);return y;}
	void makeroot(int p){access(p),splay(p),rev[p]^=1;}
	int findroot(int p){access(p),splay(p);while(ch[p][0]) p=ch[p][0];return p;}
	void split(int x,int y){makeroot(x),access(y),splay(y);}
	void link(int x,int y){makeroot(x),fa[x]=y;}
	void cut(int x,int y){split(x,y);if(fa[x]==y&&!ch[x][1]) fa[x]=ch[y][0]=0; maintain(y);}
	void modify(int x,int y){splay(x),val[x]=y,maintain(x);}
	int lca(int x,int y){return access(x),access(y);}
};

原文地址:http://www.cnblogs.com/caijianhong/p/16863435.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性