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(){ }
Informatik verbindet dich und mich.
信息将你我连结。