码迷,mamicode.com
首页 > 其他好文 > 详细

银河英雄传说

时间:2020-03-08 15:49:59      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:题意   div   题解   cout   指令   操作   英雄   using   return   

# 题意

初始有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 }

 

银河英雄传说

标签:题意   div   题解   cout   指令   操作   英雄   using   return   

原文地址:https://www.cnblogs.com/hhyx/p/12442743.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!