POJ 1988/bzoj3376[Usaco2004 Open]Cube Stacking 方块游戏

来源:互联网 发布:c 高级编程视频教程 编辑:程序博客网 时间:2024/06/05 14:06

嘛 又是一道带权并查集

不过这题要带多一点好玩的东西

f[x]表示其所在树根不用说 然后多设一个d[x]表示当前积木块最底端的是哪个 p[x]表示在x上面有多少个

求值的时候就p[d[x]]-p[x]就好

记得修改完要更新啊 因为有些地方是下面也要更新的 比如 你说呢?(这个自己想想~)

不懂就看代码咯。。

#include<cmath>#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;const int N=30002,inf=1e9;inline int read(){    int x=0,f=1; char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}    return x*f;}int f[N],p[N],d[N];int fa(int x){    if(x==f[x])return x;    int y=f[x];    f[x]=fa(f[x]),d[x]=d[y],p[x]+=p[y];    return f[x];}int main(){    int i,x,y,fx,fy,m=read(); char ch;    for(i=1;i<N;i++)d[i]=f[i]=i,p[i]=0;    while(m--)    {        scanf("\n%c",&ch);        if(ch=='M')        {            x=read(),y=read(),fx=fa(x),fy=fa(y);            int k=fa(d[fx]);            f[fy]=fx,p[fy]=p[d[fx]]+1,d[fx]=d[fy];        }        else        {            x=read(),fx=fa(x);            int k=fa(d[fx]);            printf("%d\n",p[d[x]]-p[x]);        }    }    return 0;}


1 0
原创粉丝点击