【问题描述】
有一个划分为N列的星际战场,各列依次编号为1,2,…,N。
有N艘战舰,也依次编号为1,2,…,N,其中第i号战舰处于第i列。
有T条指令,每条指令格式为以下两种之一:
1、M i j,表示让第i号战舰所在列的全部战舰保持原有顺序,接在第j号战舰所在列的尾部。
2、C i j,表示询问第i号战舰与第j号战舰当前是否处于同一列中,如果在同一列中,它们之间间隔了多少艘战舰。
现在需要你编写一个程序,处理一系列的指令。

【输入格式】
第一行包含整数T,表示共有T条指令。
接下来T行,每行一个指令,指令有两种形式:M i j或C i j。
其中M和C为大写字母表示指令类型,i和j为整数,表示指令涉及的战舰编号。

【输出格式】
你的程序应当依次对输入的每一条指令进行分析和处理:
如果是M i j形式,则表示舰队排列发生了变化,你的程序要注意到这一点,但是不要输出任何信息;
如果是C i j形式,你的程序要输出一行,仅包含一个整数,表示在同一列上,第i号战舰与第j号战舰之间布置的战舰数目,如果第i号战舰与第j号战舰当前不在同一列上,则输出-1。

【数据范围】
N≤30000,T≤500000

【输入样例】
4
M 2 3
C 1 2
M 2 4
C 4 2

【输出样例】
-1
1

【算法分析】
带权并查集与经典并查集相比,通常只定义find()函数,不定义merge()函数。
本题也是一道带权并查集的经典题目。其中:
● d[i]表示第i号战舰到头部战舰的距离。
● size[i]表示集合i的元素个数。
● 本代码中,char op; 与 cin>>op; 配合使用,否则用其他方式会出现莫名其妙的错误。
● 本代码中,先用语句 int fx=find(x); 及 int fy=find(y); 声明fx、fy 后,再执行 fx!=fy,不要直接比较 find(x)!=find(y),否则在带权并查集代码中会出现莫名其妙的错误。虽然,它们看起来似乎等价。

【算法代码】

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;const int maxn=300005;
int pre[maxn];
int s[maxn]; //s[i]:the number of elements in set i
int d[maxn]; //d[i]:the distance from ith warship to the head warshipint T;int find(int x) {if(x!=pre[x]) {int t=pre[x];pre[x]=find(pre[x]);d[x]+=d[t]; //Some operation}return pre[x];
}int main() {scanf("%d",&T);for(int i=1; i<=maxn; i++) {pre[i]=i;s[i]=1;}char op;int x, y;while(T--){cin>>op;scanf("%d%d",&x,&y);if(op=='M') {int fx=find(x);int fy=find(y);           pre[fx]=fy; //add x to yd[fx]=s[fy];s[fy]+=s[fx];} else {int fx=find(x);int fy=find(y);if(fx!=fy) printf("-1\n");else printf("%d\n", max(0, abs(d[x]-d[y])-1));}}
}/*
in1:
4
M 2 3
C 1 2
M 2 4
C 4 4out1:
-1
0in2:
4
M 2 3
C 1 2
M 2 4
C 4 2out2:
-1
1
*/

【参考文献】
https://blog.csdn.net/weixin_47456072/article/details/109598757
http://www.cnblogs.com/donkey2603089141/p/11415486.html
https://www.acwing.com/problem/content/240/
https://www.acwing.com/solution/content/11000/
https://www.acwing.com/solution/content/1005/

银河英雄传说 ← 带权并查集相关推荐

  1. 洛谷 P1196 [NOI2002]银河英雄传说 带权并查集

    https://www.luogu.org/problem/P1196 题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展 ...

  2. NOI2002银河英雄传说——带权并查集

    题目:https://www.luogu.org/problemnew/show/P1196 关键点在于存下每个点的位置. 自己糊涂的地方:位置是相对于谁的位置? 因为每次给一个原来是fa的点赋位置时 ...

  3. 学习笔记——拓展域并查集和带权并查集

    1,拓展域并查集 一般的并查集只能查找出各元素之间是否存在某一种相同的联系,如:a和b是亲戚关系,b和c是亲戚关系,这时就可以查找出a和c也存在亲戚关系.但如果存在多种相对的联系时一般的并查集就不行了 ...

  4. 2017乌鲁木齐区域赛I(带权并查集)

    #include<bits/stdc++.h> using namespace std; int f[200010];//代表元 long long rl[200010];//记rl[i] ...

  5. BZOJ 2303 方格染色(带权并查集)

    要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...

  6. POJ1703带权并查集(距离或者异或)

    题意:       有两个黑社会帮派,有n个人,他们肯定属于两个帮派中的一个,然后有两种操作 1 D a b 给出a b 两个人不属于同一个帮派 2 A a b 问a b 两个人关系 输出 同一个帮派 ...

  7. POJ1988(带权并查集,搬砖块)

    题意:        可以这样理解,有n快方形积木,一开始都是单独的放到哪,然后有两种操作 1 M a b 把a所在的那一堆落到b所在那一堆的上面(一开始自己是一堆) 2 C a 问a下面有多少个积木 ...

  8. LA3027简单带权并查集

    题意:       有n个点,一开始大家都是独立的点,然后给出一些关系,a,b表示a是b的父亲节点,距离是abs(a-b)%1000,然后有一些询问,每次询问一个节点a到父亲节点的距离是多少? 思路: ...

  9. hdu3234 带权并查集(XOR)

    题意:       给你n个未知的正整数,有三总操作       I P V            P的值是V       I P Q V          P XOR Q = V       Q K ...

最新文章

  1. ***必备兵器与技能
  2. 方差分析的MATLAB实现(单因子)
  3. 韩国的计算机科学家,韩国科学技术院用普通相机为AR/VR复刻真实世界物理对象...
  4. mysql mybatis 工具类_我肝了一个星期,为你们整理出了mybatis程序配置教程
  5. linux ping 命令_Linux ping命令示例
  6. java通字乱码_Java解决通信过程的中文乱码的问题
  7. 神经网络之BP算法【图文并茂】
  8. 青岛理工大学 研究生 吴斌
  9. 论文理解记录:The Lottery Ticket Hypothesis
  10. 判断一个点是否在多边形的内部(包括边)
  11. 7.Unity2D 横版 未受伤害时,血条缓慢变透明+伤害数值显示(浮动,大小,颜色)+协程的应用
  12. 风影版OllyDBG 1.10 2016-12-09修改版
  13. 数据结构课程设计之区块链工作原理模拟设计
  14. 发射极正偏,集电极反偏
  15. 小白也能轻松上手selenium,无忧获取淘宝商品信息,献给手把手教的会的你
  16. 元宇宙基础设施五层级模型的关系作用与实力。
  17. 台式计算机有乱码如何解决,电脑出现乱码怎么修复 电脑字体乱码解决方法
  18. 微信公众号网页H5跳转微信小程序
  19. 所谓IIS500内部服务器错误
  20. 无法将“webpack”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

热门文章

  1. php的getopt函数,PHP 中 getopt 函数的用法
  2. 读陈景润之《初等数论》
  3. 新建vue3.0 项目—步骤
  4. 计算机组成原理硬布线实验心得,计算机组成原理实验 2.9 硬布线控制器课件
  5. 12(PHP图像的制作,例如验证码)
  6. 痞子衡嵌入式:ARM Cortex-M内核那些事(9.1)- 存储保护(MPU - PMSAv6/7)
  7. 2.2.2 定点数的移位运算
  8. 最长递增子序列(信封嵌套问题)
  9. 前端常用的工具方法,常用js方法
  10. ClassLoader整理总结