BZOJ4530 [Bjoi2014]大融合

来源:互联网 发布:已备案域名购买 编辑:程序博客网 时间:2024/05/01 19:25

LCT维护子树大小即可

有关LCT维护子树信息的讲解可以看这里

#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<algorithm>#include<iomanip>#include<vector>#include<stack>#include<queue>#include<map>#include<set>#include<bitset>using namespace std;#define MAXN 100010#define MAXM 1010#define ll long long#define INF 1000000000#define MOD 1000000007#define eps 1e-8int fa[MAXN],son[MAXN][2],siz[MAXN],Siz[MAXN];bool rev[MAXN];int st[MAXN],tp;int n,m;void pt(){int i;for(i=1;i<=n;i++){cout<<son[i][0]<<' '<<son[i][1]<<'!'<<fa[i]<<'!'<<siz[i]<<' '<<' '<<Siz[i]<<endl;}cout<<endl;}inline bool ir(int x){return son[fa[x]][0]!=x&&son[fa[x]][1]!=x;}inline void torev(int x){swap(son[x][0],son[x][1]);rev[x]^=1;}inline void pd(int x){if(rev[x]){torev(son[x][0]);torev(son[x][1]);rev[x]=0;}}inline void ud(int x){siz[x]=siz[son[x][0]]+siz[son[x][1]]+1+Siz[x];}inline void cot(int x,int y,int z){if(x){fa[x]=y;}if(y){son[y][z]=x;}}inline void rot(int x,bool z){int xx=fa[x],xxx=fa[xx];int t=son[x][z];cot(son[x][z],xx,z^1);if(ir(xx)){fa[x]=xxx;}else{cot(x,xxx,son[xxx][1]==xx);}cot(xx,x,z);ud(xx);}inline void apd(int x){int i;st[++tp]=x;for(i=x;!ir(i);i=fa[i]){st[++tp]=fa[i];}for(;tp;tp--){pd(st[tp]);}}void splay(int x){apd(x);while(!ir(x)){int xx=fa[x],xxx=fa[xx];if(ir(xx)){rot(x,son[xx][0]==x);}else{bool z=son[xxx][0]==xx;if(son[xx][z]==x){rot(x,z^1);rot(x,z);}else{rot(xx,z);rot(x,z);}}}ud(x);}inline void acs(int x){int t=0;while(x){splay(x);Siz[x]+=siz[son[x][1]];son[x][1]=t;Siz[x]-=siz[t];ud(x);t=x;x=fa[x];}}inline void reboot(int x){acs(x);splay(x);torev(x);}inline void link(int x,int y){reboot(x);reboot(y);fa[x]=y;Siz[y]+=siz[x];ud(y);}int main(){int i,x,y;char o[10];scanf("%d%d",&n,&m);for(i=1;i<=n;i++){siz[i]=1;}for(i=1;i<=m;i++){scanf("%s%d%d",o,&x,&y);if(o[0]=='A'){link(x,y);}else{reboot(x);acs(y);splay(x);printf("%lld\n",(ll)(Siz[y]+1)*(siz[x]-Siz[y]-1));}}return 0;}/*8 6A 2 3A 3 4A 3 8A 8 7A 6 5Q 3 810 5A 1 2 Q 1 2 */


0 0