有n个点,一开始都是孤立的,然后有I,E两种操作
I u v,把u的父节点设为v,距离为abs(u-v) % 1000,保证u之前没有父节点
E 询问u到根节点的距离
#include<iostream> #include<cmath> using namespace std; const int maxn=2e4+5; int par[maxn],dis[maxn]; void init(int n) { for(int i=0;i<=n;i++) { par[i]=i; dis[i]=0; } } int find(int x) { if(x==par[x]) return x; int root=find(par[x]); dis[x]+=dis[par[x]]; return par[x]=root; } int main() { int t; cin>>t; while(t--) { int n; cin>>n; init(n); char s[5]; while(cin>>s,s[0]!='O') { int p,q; if(s[0]=='E') { cin>>p; find(p); cout<<dis[p]<<endl; } if(s[0]=='I') { cin>>p>>q; par[p]=q; dis[p]=abs(p-q)%1000; } } } return 0; }