银河英雄传说

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 }

 

以上是关于银河英雄传说的主要内容,如果未能解决你的问题,请参考以下文章

并查集银河英雄传说

[luoguP1196] 银河英雄传说(并查集)

P1196 [NOI2002]银河英雄传说

银河英雄传说(带权并查集)

NOI2002银河英雄传说

NOI2002银河英雄传说