-
P2342 叠积木
- 思路: val[]表示这个点下面的数目,s[]表示以个点的为根的总数,fa[]为并查集数组
- 每次路径压缩是带权压缩 ,合并两块操作就是,把两个根节点合并 ,合并根节点除了时需要进行的操作是,
- x的根更新 val[u]数目变为val[u]=s[v],y的根节点v更新 s[v]+=s[u].注意输出是先进行路径压缩
-
#include<bits/stdc++.h> using namespace std; #define maxn 134567 int n,val[maxn],fa[maxn]; int s[maxn],x,y,u,v; char str[15]; int fond(int x) { if(fa[x]==x)return x; int temp=fa[x]; fa[x]=fond(fa[x]); val[x]+=val[temp]; return fa[x]; } int main() { for(int i=1; i<=130010; i++) { fa[i]=i; val[i]=0; s[i]=1; } scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%s",str); if(*str=='M') { scanf("%d%d",&x,&y); u=fond(x); v=fond(y); fa[u]=v; val[u]=s[v]; s[v]+=s[u]; } else { scanf("%d",&x); fond(x); printf("%d\n",val[x]); } } return 0; }
P2342 叠积木-带权并查集
最新推荐文章于 2019-07-18 23:21:00 发布