並查集每一個點的信息記錄的其實都是根節點的信息。
更新的時候不斷遞歸出根節點的信息,然後更新自己的信息就可以了。
#include#include #include #include using namespace std; int set[30005],cnt[30005],num[30005]; int find(int x) { if(x!=set[x]){ int S=set[x]; set[x]=find(set[x]); num[x]+=num[S]; } return set[x]; } int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=0;i<=30000;i++) { num[i]=0; cnt[i]=1; set[i]=i; } while(n--) { int a,b; char op[5]; scanf("%s",op); if(op[0]=='M') { scanf("%d%d",&a,&b); int x=find(a); int y=find(b); if(x==y)continue; set[x]=y; num[x]=cnt[y]; cnt[y]+=cnt[x]; } else { scanf("%d",&a); find(a); printf("%d\n",num[a]); } } } return 0; }