银河英雄传说
Posted hhyx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了银河英雄传说相关的知识,希望对你有一定的参考价值。
# 题意
初始有N艘战舰,开始每个战舰单独列,有t条指令,每个指令可能包含两个操作
1)M i j,表示让第i号战舰所在列的全部战舰保持原有顺序,接在第j号战舰所在列的尾部。
2)C i j,表示询问第i号战舰与第j号战舰当前是否处于同一列中,如果在同一列中,它们之间间隔了多少艘战舰。
N <= 3e4
t<=5e5
# 题解
树链,维护两个数组sz表示集合的大小,d表示当前点到树根的距离,每次询问间隔时候两个到根距离的差的绝对值-1就是间隔了多少个
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=3e4+10; 4 int fa[N]; 5 int n; 6 int sz[N]; 7 int d[N]; 8 int find(int x){ 9 if(fa[x]==x) 10 return x; 11 int root=find(fa[x]);//递归计算代表 12 d[x]+=d[fa[x]];//维护d数组对边权求和 13 return fa[x]=root;//路径压缩 14 } 15 void merge(int a,int b){ 16 a=find(a),b=find(b); 17 fa[a]=b; 18 d[a]=sz[b]; 19 sz[b]+=sz[a]; 20 } 21 void solve(){ 22 char op; 23 int i,j; 24 cin>>op>>i>>j; 25 if(op==‘M‘){ 26 merge(i,j); 27 } 28 else { 29 if(find(i)==find(j)) 30 cout<<abs(d[j]-d[i])-1<<endl; 31 else 32 cout<<"-1"<<endl; 33 } 34 } 35 int main(){ 36 int t; 37 cin>>t; 38 for(int i=1;i<=N;i++){ 39 fa[i]=i; 40 sz[i]=1; 41 d[i]=0; 42 } 43 while(t--){ 44 solve(); 45 } 46 }
以上是关于银河英雄传说的主要内容,如果未能解决你的问题,请参考以下文章