银河英雄传说

luogu 1196

ssl 1225

题目大意:

有n列船,每列一开始有一艘船,可以将某一艘船所在的列所有船接到另外一列,然后会问某两艘船是否在一列,如果在那中间有多少艘船

原题:

题目描述

公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展。
宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争。泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌。
杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气。在这次决战中,他将巴米利恩星域战场划分成300003000030000列,每列依次编号为1,2,…,300001, 2, …,300001,2,…,30000。之后,他把自己的战舰也依次编号为1,2,…,300001, 2, …, 300001,2,…,30000,让第iii号战舰处于第iii列(i=1,2,…,30000)(i = 1, 2, …, 30000)(i=1,2,…,30000),形成“一字长蛇阵”,诱敌深入。这是初始阵形。当进犯之敌到达时,杨威利会多次发布合并指令,将大部分战舰集中在某几列上,实施密集攻击。合并指令为Mi,jM_{i,j}Mi,j​ ,含义为第iii号战舰所在的整个战舰队列,作为一个整体(头在前尾在后)接至第j号战舰所在的战舰队列的尾部。显然战舰队列是由处于同一列的一个或多个战舰组成的。合并指令的执行结果会使队列增大。
然而,老谋深算的莱因哈特早已在战略上取得了主动。在交战中,他可以通过庞大的情报网络随时监听杨威利的舰队调动指令。
在杨威利发布指令调动舰队的同时,莱因哈特为了及时了解当前杨威利的战舰分布情况,也会发出一些询问指令:Ci,jC_{i,j}Ci,j​ 。该指令意思是,询问电脑,杨威利的第iii号战舰与第jjj号战舰当前是否在同一列中,如果在同一列中,那么它们之间布置有多少战舰。
作为一个资深的高级程序设计员,你被要求编写程序分析杨威利的指令,以及回答莱因哈特的询问。
最终的决战已经展开,银河的历史又翻过了一页……

输入输出格式

输入格式:

第一行有一个整数T(1≤T≤500,000)T(1 \le T \le 500,000)T(1≤T≤500,000),表示总共有TT条指令。
以下有TT行,每行有一条指令。指令有两种格式:Mi,jM_{i,j}Mi,j​:iii和jjj是两个整数(1≤i,j≤30000)(1 \le i,j \le 30000)(1≤i,j≤30000),表示指令涉及的战舰编号。该指令是莱因哈特窃听到的杨威利发布的舰队调动指令,并且保证第iii号战舰与第jjj号战舰不在同一列。Ci,jC_{i,j}Ci,j​ :iii和jjj是两个整数(1≤i,j≤30000)(1 \le i,j \le 30000)(1≤i,j≤30000),表示指令涉及的战舰编号。该指令是莱因哈特发布的询问指令。

输出格式:

依次对输入的每一条指令进行分析和处理:
如果是杨威利发布的舰队调动指令,则表示舰队排列发生了变化,你的程序要注意到这一点,但是不要输出任何信息;
如果是莱因哈特发布的询问指令,你的程序要输出一行,仅包含一个整数,表示在同一列上,第iii号战舰与第jjj号战舰之间布置的战舰数目。如果第iii号战舰与第jjj号战舰当前不在同一列上,则输出−1−1−1。

输入输出样例

输入样例:

4
M 2 3
C 1 2
M 2 4
C 4 2

输出样例:

-1
1

说明

【样例说明】

战舰位置图:表格中阿拉伯数字表示战舰编号

解题思路:

每一艘船为一个点,当要合并时,连接两个点,更节点为最前面的,然后还要用一个frontfrontfront数组来存前面有多少艘船,然后求距离直接用frontfrontfront来相减求出

代码:

#include<cstdio>
#define abs(a) ((a)<0?-(a):(a))//手打abs
using namespace std;
int n,x,y,xx,yy,dad[30005],front[30005],num[30005];
char c;
int find(int dep)//并查集
{if (dad[dep]==dep) return dep;int s=find(dad[dep]);front[dep]+=front[dad[dep]];//累加,前面有多少个点就加上,不用担心会重复加,他加过一次就会练到根节点,然后就不会再加了return dad[dep]=s;
}
int main()
{scanf("%d",&n);for (int i=1;i<=30000;++i)dad[i]=i,num[i]=1;for (int i=1;i<=n;++i){c=getchar();while (c!='M'&&c!='C') c=getchar();scanf("%d %d",&x,&y);xx=find(x);yy=find(y);if (c=='M'){dad[xx]=yy;//连接front[xx]+=num[yy];//num表示当前列有多少个点,前面多了一排num[yy]+=num[xx];//后面多了一排}else xx==yy?printf("%d\n",abs(front[x]-front[y])-1):printf("-1\n");//在同一列就输出,否则-1}
}

【并查集】银河英雄传说 (luogu 1196/ssl 1225)相关推荐

  1. 【并查集】打击犯罪(ssl 2342)

    打击犯罪 ssl 2342 题目大意: 有n个人某些人之间有连接(连接成一个团伙),现在要最大的团伙人数不大于n/2,要最少要删掉几个人(要按顺序删) 原题: 题目描述: 某个地区有n(n<=1 ...

  2. 并查集——银河英雄传说()

    传送门:238. 银河英雄传说 - AcWing题库 思路: 使用并查集可以传递关系的性质,维护一个cnt[i]数组,该数组用于记录以i为跟并查集树下的战舰的数量,用一个d[i]数组表示在i前面的战舰 ...

  3. c++自带的可持久化平衡树?rope大法好!(超详细解答 + 5道例题讲解,可直接替代可持久化的线段树、并查集、平衡树!)

    整理的算法模板合集: ACM模板 目录 c++自带的可持久化平衡树?rope大法好! 1. 声明 2. 支持操作 char类型的rope int类型的rope 3. 具体的细节 4. "可持 ...

  4. 蓝桥备赛第四周 同余+并查集

    文章目录 0x33 同余 同余类+剩余系+费马小定理+欧拉定理及推论 最幸运的数字 题解 这次的代码很多东西:欧拉函数快速求解,gcd,快速乘,各种定理,建议当模板背 10LL 转换成长整型 快速乘+ ...

  5. 【并查集】家谱(luogu 2814/ssl 2343)

    家谱 luogu 2814 ssl 2343 题目大意: 给一堆父子关系,求出一些人的最大的祖先 原题: 题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到 ...

  6. 洛谷1196 银河英雄传说(并查集)

    传送门 [题目分析] 题目整个就一赤裸裸的并查集啊....就多了一个记录深度.... 每次M操作就是merge x->y,每个并查集,记录父亲.大小.深度三个值,每次find父亲的时候记录深度即 ...

  7. 并查集专题(亲戚,格子游戏,银河英雄传说)

    文章目录 序言 正文 亲戚 时间限制: 1000 ms 空间限制: 262144 KB 题目描述 输入 输出 样例输入 样例输出 讲解 Wrong Answer Code Accepted Code ...

  8. 【图论】【并查集】矩形(ssl 1222)

    矩形 ssl 1222 题目大意: 有n个矩阵,现在将有重叠部分的两个矩阵合并成一个图形,问有多少个图形 原题: 题目描述 在一个平面上有n个矩形.每个矩形的边都平行于坐标轴并且都具有值为整数的顶点. ...

  9. 【并查集】团伙(luogu 1892)

    团伙 luogu 1892 代码: 定义对手的对手是朋友,朋友的朋友是朋友,现在有n个人和m组关系,如果两个人是朋友那么他们属于同一个团伙,问有多少个团伙 原题: 题目描述 1920年的芝加哥,出现了 ...

最新文章

  1. spring--aop总结
  2. ubuntu 安装截图工具 Shutter,并设置快捷键 Ctrl+Alt+A
  3. Android的Toast介绍-android学习之旅(三十六)
  4. java spring包_java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式...
  5. java cxf服务端_webservice概述及cxf在Java开发中应用(二) 简单搭建cxf服务端
  6. python 文件下载服务器异常_python 从远程服务器下载日志文件的程序
  7. node.js源码安装
  8. bias tee电路设计-电容电感值
  9. LabVIEW编程LabVIEW开发 Kepco ABC程控电源 例程与相关资料
  10. windows删除“找不到该项目”的文件
  11. (node:3872) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issue
  12. 代码:灰度重心法求激光中心线(matlab)
  13. Waited too long for library cache load lock
  14. 【生存游戏】一组按序排列围成一圈的参赛选手,通过逢3退1游戏机制筛选出最后一个生存者的Java算法
  15. 数值积分: 梯形规则--复合梯形规则--辛普森规则--复合辛普森规则--龙贝格求积公式
  16. 你不知道的nodejs性能优化
  17. gcc开启C99或C11标准支持
  18. 百择电商:抖音什么情况下会被限流?
  19. 企业WiFi安全管家 帮你排忧解难
  20. 电脑安装了git之后拉取代码报错:git fatal: Authentication failed for

热门文章

  1. python hexdigest,Java方法,可以为Hex中的HMAC-SHA256提供与Python方法相同的输出
  2. 32位mysql安装包_MySQL安装指南(CPT103)
  3. 服务器不知道怎么回事安卓系统很卡,为什么安卓系统很容易变卡?该怎么解决?看完长知识了...
  4. mycli mysql_MyCLI :易于使用的 MySQL/MariaDB 客户端
  5. [mybatis]typeHandlers日期类型的处理
  6. c++ 多核cpu序列号_关于 CPU 的一些基本知识总结
  7. 树的度,结点,叶子结点,二叉树
  8. 经典排序算法(10)——基数排序算法详解
  9. HDU 6750 Function(莫比乌斯反演)(2020百度之星初赛1)
  10. 51nod 1847 奇怪的数学题(数论/min25筛/杜教筛/斯特林数)