/*
如果你知道双向链表,那么这题就是和它有关;
第一步,
得出下面一堆的最上的一个方块,
得出上面一堆的最下面一个方块,
将这二方块的连起来,
第二步:
更新上面一堆中的方块的权值(经下面一堆最上面的权值为基准);
第三步:
输出:直接输出的相应的权值;
*/
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 100005;
int root[MAX];
int dis[MAX];
int Uroot[MAX];
int Troot[MAX];
int T;
int findLeft(int x){
if(Uroot[x] == x){
return x;
}else{
findLeft(Uroot[x]);
}
}
int find(int x){
if(root[x] == x){
return x;
}else{
find(root[x]);
}
}
void un(int up,int down){
root[up] = down;
Uroot[down] = up;
}
void updata(int up, int down){
while(1){
dis[up] = dis[up] + dis[down] + 1;
if(up == Uroot[up]){
break;
}
up = Uroot[up];
}
}
int main(){
freopen("a.txt", "r", stdin);
scanf("%d",&T);
for(int i=1; i<=T; ++i){
dis[i] = 0;
Troot[i] = Uroot[i] = root[i] = i;
}
int a,b;
for(int k=1; k<=T; ++k){
char ch;
cin>>ch;
if(ch == 'M'){
scanf("%d %d", &a, &b);
int up = find(a);
int down = find(b);
if(up != down){
down = findLeft(down);
un(up, down);
updata(up,down);
}
}else{
scanf("%d", &a);
printf("%d\n", dis[a]);
}
}
return 0;
}
POJ 1988
最新推荐文章于 2019-04-29 22:56:12 发布