题意:有n个节点,初始时每个节点的父节点都不存在,你的任务是执行一次I操作和E操作,格式如下:
I u v:把节点u的父节点设为v,距离为|u-v|除以1000的余数。输入保证之星指令前没有父节点
E u:询问u到根节点的距离
题意显然是要用并查集
#include <stdio.h> #include <iostream> #include <algorithm> using namespace std; const int MAXN = 20000 + 10; int p[MAXN]; int d[MAXN]; int findset(int x){ if(p[x]!=x){ int root = findset(p[x]); d[x] += d[p[x]]; return p[x] = root; } else return x; } int main(){ // freopen("in.txt", "r", stdin); int cas; scanf("%d", &cas); while(cas--){ int n; scanf("%d", &n); int i; for(i=1; i<=n; i++){ p[i] = i; d[i] = 0; //!清除d数组原有数据,防止混乱 } char op[5]; while(scanf("%s", &op) && op[0]!='O'){ int u, v; if(op[0] == 'I'){ scanf("%d%d", &u, &v); p[u] = v; d[u] = abs(u-v)%1000; } if(op[0]=='E'){ scanf("%d", &u); findset(u); printf("%d\n", d[u]); } } } }