原题链接:

[NOI2002] 银河英雄传说 - 洛谷https://www.luogu.com.cn/problem/P1196

题目背景

公元 5801 年,地球居民迁至金牛座 α 第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展。

宇宙历 799 年,银河系的两大军事集团在巴米利恩星域爆发战争。泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌。

题目描述

杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气。在这次决战中,他将巴米利恩星域战场划分成 30000 列,每列依次编号为 1,2,…,30000。之后,他把自己的战舰也依次编号为 1,2,…,30000,让第 i 号战舰处于第 i 列,形成“一字长蛇阵”,诱敌深入。这是初始阵形。当进犯之敌到达时,杨威利会多次发布合并指令,将大部分战舰集中在某几列上,实施密集攻击。合并指令为 M i j,含义为第 i 号战舰所在的整个战舰队列,作为一个整体(头在前尾在后)接至第 j 号战舰所在的战舰队列的尾部。显然战舰队列是由处于同一列的一个或多个战舰组成的。合并指令的执行结果会使队列增大。

然而,老谋深算的莱因哈特早已在战略上取得了主动。在交战中,他可以通过庞大的情报网络随时监听杨威利的舰队调动指令。

在杨威利发布指令调动舰队的同时,莱因哈特为了及时了解当前杨威利的战舰分布情况,也会发出一些询问指令:C i j。该指令意思是,询问电脑,杨威利的第 i 号战舰与第 j 号战舰当前是否在同一列中,如果在同一列中,那么它们之间布置有多少战舰。

作为一个资深的高级程序设计员,你被要求编写程序分析杨威利的指令,以及回答莱因哈特的询问。

输入格式

第一行有一个整数 T(1≤T≤5×10e5),表示总共有 T 条指令。

以下有 TT 行,每行有一条指令。指令有两种格式:

  1. M i j:i 和 j 是两个整数(1≤i,j≤30000),表示指令涉及的战舰编号。该指令是莱因哈特窃听到的杨威利发布的舰队调动指令,并且保证第 ii 号战舰与第 jj 号战舰不在同一列。

  2. C i j:i 和 j 是两个整数(1≤i,j≤30000),表示指令涉及的战舰编号。该指令是莱因哈特发布的询问指令。

输出格式

依次对输入的每一条指令进行分析和处理:

  • 如果是杨威利发布的舰队调动指令,则表示舰队排列发生了变化,你的程序要注意到这一点,但是不要输出任何信息。
  • 如果是莱因哈特发布的询问指令,你的程序要输出一行,仅包含一个整数,表示在同一列上,第 i 号战舰与第 j 号战舰之间布置的战舰数目。如果第 i 号战舰与第 j 号战舰当前不在同一列上,则输出−1。

输入输出样例

输入 #1复制

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

输出 #1复制

-1
1

解题思路:

这题咋一看好像很简单,直接使用并查集模拟即可。但一看难度 普及+/提高 事情并非这么简单。一看原来不仅要查询两点是否联通,也不是查询这两点存在的列有多少战舰,而是查询这两点联通的话中间有多少条战舰

所以我们需要用到一个重要的数据结构:带权并查集!dis[i]存储i到其祖先的距离,但如何获取到他祖先的距离呢?

初始状态祖先都为自己dis[i]自然就等于0。然后当j列拼接到i列之后那 j 列的队头到 i 列的距离自然就等于 i 列的所有战舰数量。所以我们还需要一个数组num来存储战舰的数量而一开始所有战舰都是队头,在union的过程中每列到队头的距离就都获取了

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 30000;
int dis[30005],num[30005],fa[30005];
int t;
int find(int x)
{if(x == fa[x])   return x;//基础的并查集代码int k = fa[x];fa[x] = find(fa[x]);dis[x]+=dis[k];//更新dis的距离为原队头到队头的距离加上其到原队头的距离num[x] = num[k];//更新其所在列的数量return fa[x];
}void merge(int x,int y)
{int r1 = find(x),r2 = find(y);if(r1!=r2){fa[r1] = r2;dis[r1] = num[r2];//如思路所说,r1到新队头的距离等于原本那列原有的数量num[r2] += num[r1];//更新那一列的数量num[r1] = num[r2];}
}
int main()
{char c;int i,j;for(int i = 1;i<=30000;++i){fa[i] = i;dis[i] = 0;num[i] = 1;  }   cin>>t;while(t--){cin>>c>>i>>j;if(c=='M')merge(i,j);else{int r1 = find(i),r2 = find(j);if(r1!=r2)    cout<<-1<<endl;else{cout<<abs(dis[j]-dis[i])-1<<endl;}}}return 0;
}

P1196 [NOI2002] 银河英雄传说相关推荐

  1. 并查集:P1196 [NOI2002] 银河英雄传说

    传送门 带权并查集最棒了 dep记录深度,size记录集合大小 转移见代码 #include<cstdio> #include<algorithm> #include<i ...

  2. [Luogu 1196] NOI2002 银河英雄传说

    [Luogu 1196] NOI2002 银河英雄传说 话说十六年前的 NOI 真简单... 我一开始还把题看错了- 题意:一群人,每个人各自成一队,每次命令让两队首位相接合成一队,每次询问问你某两个 ...

  3. NOI2002银河英雄传说

    题目大意: 有一个划分为N列的星际战场,各列依次编号为1,2,--,N.有N艘战舰,也依次编号为1,2,--,N,其中第i号战舰处于第i列. 有M条指令,每条指令格式为以下两种之一: 1.M i j, ...

  4. NOI2002 银河英雄传说

    搞了几次才过...太弱了... 本题的关键想到扩展并查集,在基础并查集的基础上额外维护一个集合的大小和当前点在集合中的位置就可以了. Code: typenode=record fa,d,l:long ...

  5. 洛谷 P1196 银河英雄传说

    题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...

  6. 【NOI2002】银河英雄传说

    这是一道带权并查集的题目. 我们维护三个数组,f[x]表示节点x所在集合的代表元素(相当于合并之后的树根),size[x]表示以x为代表元素的集合的大小是多少(相当于一列战舰的数量),d[x]表示在这 ...

  7. 洛谷P1196 银河英雄传说

    题目大意: 一些战舰,初始时每个都在自己编号对应的队列中,现在有两个操作 : M a b:把a战舰所在的队列顺序不变的接到b战舰所在队列尾部 C a b:询问a b在同一个队列之间的距离 如果a b不 ...

  8. P1196 ssl1225-银河英雄传说【图论,并查集】

    正题 题目链接: https://www.luogu.org/problemnew/show/P1196 大意 有30000列和30000个飞船,开始时i号飞船在i列上.有两种操作: (1)将x所在的 ...

  9. Google的银河英雄传说

    Google的银河英雄传说 在漫长的人类发展长河中,曾经出现过一位通晓一切知识的谜之生命体,它的名字,叫做 Google . Google 博学,却并不高傲,相反, 它 总是平易近人的为所有人解难难题 ...

  10. 【题解 海量集训 并查集】 银河英雄传说

    题目传送门 题目描述: 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆 ...

最新文章

  1. 关于异步请求的一些事
  2. 实战Nginx与PHP(FastCGI)的安装、配置与优化
  3. Zookeeper 3.5启动时 8080端口被占用
  4. 随机生成元素升序向量_实验二MATLAB运算基础 -
  5. 21天Jmeter打卡Day21生成HTML测试报告
  6. java编写一个彩票开奖的模拟程序.游戏共有两种玩法,一种是21选5,即玩家输入5个1到21内的不重复的数。另外一种玩法是6+1玩法,即要求玩家输入7个整数,代表所购买的彩票号码,最后一个是特码。
  7. linux 6.5端口开启关闭,linux CentOS6.5 防火墙(关闭除提供系统服务以外的端口)...
  8. paip. mysql如何临时 暂时 禁用 关闭 触发器
  9. 《Spring实战(第四版)》pdf
  10. 第10章 项目沟通管理
  11. excel退出打印预览快捷键?
  12. 服务器能打开其他网站打不开,为什么有的网页打不开其他能打开(浏览器网页打不开的原因有哪些)...
  13. linux java目录 语法_Linux 文件和目录的属性
  14. 机器学习算法(一):基于逻辑回归的分类预测
  15. 编程需要知道多少数学知识?
  16. python免费的实时语音交互(讯飞语音识别+青云客Robot)
  17. 一文看懂SMT车间生产环境要求及管理规范
  18. 《人工智能》机器学习 - 第6章感知机模型(一 理论讲解)
  19. XML DTD Schema 学习-Schema 介绍
  20. 一篇文章搞懂【Emmet】语法规则(前端必备技能)

热门文章

  1. docker-the input device is not a TTY. If you are using mintty, try prefixing the command with ‘winp
  2. 激活Windows Vista Home Basic Aero玻璃效果
  3. 如何科学的建立自己的个人网站
  4. 虫虫吃第一颗豆子---第一次作业
  5. Linux系统下安装Chrome浏览器
  6. 十二星座的来历和希腊神话12主神简介
  7. 12本最具影响力的程序员书籍_书籍书评_酷勤网
  8. C/C++ 如何判断闰年,对判断闰年条件的疑惑解答
  9. 全球网络安全行业全景图与中国网络安全行业全景图-2022
  10. 突破SBO屏蔽限制,自由实现快捷键自定义