BZOJ 3376: [Usaco2004 Open]Cube Stacking 方块游戏

来源:互联网 发布:sql导入 powerdesigner 编辑:程序博客网 时间:2024/06/03 20:10

带权并查集

题目传送门

简单的带权并查集,sum[i]表示i这堆有多少个方块,num[i]表示在i的下面有多少方块。找爸爸时更新即可。
注意查询时需要再空找一次爸爸。

代码:

#include<cstdio>#include<algorithm>#include<cstring>#define MAXN 30000using namespace std;int fa[MAXN+5],num[MAXN+5],sum[MAXN+5];int n;char readc(){    static char buf[100000],*l=buf,*r=buf;    if (l==r) r=(l=buf)+fread(buf,1,100000,stdin);    if (l==r) return EOF;    else return *l++;}inline int _read(){    int num=0; char ch=readc();    while ((ch<'0'||ch>'9')&&ch!='M'&&ch!='C') ch=readc();    if (ch=='M'||ch=='C') return (int)ch;    while (ch>='0'&&ch<='9'){ num=num*10+ch-48; ch=readc(); }    return num;    }int findfather(int x){    if (fa[x]==x)        return x;    int fat=fa[x];    fa[x]=findfather(fa[x]);    num[x]+=num[fat];    return fa[x];}int main(){    n=_read();    for (int i=1;i<=MAXN;i++){        fa[i]=i;        sum[i]=1;    }    while (n--){        int flag=_read(),x=_read();        if (flag=='M'){            int y=_read();            int fx=findfather(x),fy=findfather(y);            fa[fx]=fy;            num[fx]+=sum[fy];            sum[fy]+=sum[fx];        }        if (flag=='C'){            findfather(x);            printf("%d\n",num[x]);        }    }    return 0;}