其实我连splay都还不怎么会。
今天先抄了黄学长的bzoj2049,以后一定要把它理解了。
写LCT怎么能不%数据结构大神yeweining呢?%%%chrysanthemums %%%切掉大森林的全ZJ唯一一人
#include<cstdio> #include<algorithm> #define N 1000005 using namespace std; int n,m; int fa[10005],c[10005][2],f[10005][2],st[10005];bool rev[10005]; inline bool isroot(int x) { return c[fa[x]][0]!=x&&c[fa[x]][1]!=x; } void push_down(int k) { int l=c[k][0],r=c[k][1]; if(rev[k]) { rev[k]^=1;rev[l]^=1;rev[r]^=1; swap(c[k][0],c[k][1]); } } void rotate(int x) { int y=fa[x],z=fa[y],l,r; if(c[y][0]==x)l=0;else l=1; r=l^1; if(isroot(y)==0) { if(c[z][0]==y)c[z][0]=x;else c[z][1]=x; } fa[x]=z;fa[y]=x;fa[c[x][r]]=y; c[y][l]=c[x][r];c[x][r]=y; } void splay(int x) { int top=0;st[++top]=x; for(int i=x;!isroot(i);i=fa[i]) { st[++top]=fa[i]; } for(int i=top;i;i--)push_down(st[i]); while(!isroot(x)) { int y=fa[x],z=fa[y]; if(!isroot(y)) { if(c[y][0]==x^c[z][0]==y)rotate(x); else rotate(y); } rotate(x); } } void access(int x) { int t=0; while(x) { splay(x);c[x][1]=t;t=x;x=fa[x]; } } void rever(int x) { access(x);splay(x);rev[x]^=1; } void link(int x,int y) { rever(x);fa[x]=y;splay(x); } void cut(int x,int y) { rever(x);access(y);splay(y);c[y][0]=fa[x]=0; } int find(int x) { access(x);splay(x);int y=x; while(c[y][0])y=c[y][0]; return y; } int main() { char s[10]; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%s",s);int x,y; scanf("%d%d",&x,&y); if(s[0]==‘C‘)link(x,y); else if(s[0]==‘D‘)cut(x,y); else { if(find(x)==find(y))printf("Yes\n");else printf("No\n"); } } }
洞穴勘测
http://wenku.baidu.com/link?url=x6FCcjtWt-mcj9-do9MFL7lsXB4o2G1T0aG3p-XFYkuNyLKW0Kg-o-u_DUWnI_L_yIVJfHcrE_ThkrfoBlmWqJM-TburN1KlZO9wOvKJmA3
---------这是一篇很详尽的讲稿
时间: 2024-12-10 23:25:02