AcWing 238. 银河英雄传说(C++)
题目链接
分析
可以把每艘战舰进入队列时的顺序作为 属性值,表示为这艘战舰到队列头部战舰的距离,用d[i]表示i号战舰到头部战舰的距离,每次把一个战舰队列接到另一个战舰队列的尾部时, 把前者头部战舰的d[i]改为后者整个队列的长度, 然后后者队列长度 再加上前者队列长度
代码 (带权并查集)
#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;const int N = 3e4 + 10;
int p[N], Size[N], d[N], n, k;int find(int x) {if (p[x] != x) {//使用root保存当前集合的根节点int root = find(p[x]);//加上原来的根节点到它上一个节点的距离 d[x] += d[p[x]]; p[x] = root;}return p[x];
}int main() {scanf("%d", &n);//输入指令次数/*初始化并查集数组和Size数组,Size[i]表示集合i有多少元素,只有根节点才有效*/for (int i = 1; i <= N;i++) {p[i] = i;Size[i] = 1;}string op;int a, b;while (n--) {cin >> op;scanf("%d%d", &a, &b);if (op == "M") {int pa = find(a);int pb = find(b);//将a所在的集合融入b所在的集合p[pa] = pb;//a本来到根节点的距离为0,现在是b所在的集合的大小d[pa] = Size[pb];//b所在的集合大小加上a所在的集合的大小Size[pb] += Size[pa];} else {int pa = find(a);int pb = find(b);//如果不是同一个集合,即不是同一列,输出-1if (pa != pb) printf("-1\n");/*如果是同一个集合,输出两个元素之间的相对距离-1;如果两个元素是相同的,则输出0*/else printf("%d\n", max(0, abs(d[a] - d[b]) - 1));}}
}
AcWing 238. 银河英雄传说(C++)相关推荐
- Acwing 238. 银河英雄传说
Acwing 238. 银河英雄传说 有一个划分为 N 列的星际战场,各列依次编号为 1,2,-,N. 有 N 艘战舰,也依次编号为 1,2,-,N,其中第 i 号战舰处于第 i 列. 有 T 条指令 ...
- 238. 银河英雄传说(并查集,扩展域)
238. 银河英雄传说 - AcWing题库 分析: 由于要求i,j战舰之间的距离,我们就应该想到拓展域 拓展域要实现: 能够计算第i艘战舰到第j艘战舰距离 我们可以用一个拓展域来存储战舰 ...
- 算法——AcWing算法提高课中代码和题解
文章目录 第一章 动态规划 (完成情况:64/68) 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP 第二章 搜索 ...
- 【高级数据结构】并查集
目录 A.AcWing 1250. 格子游戏 B.AcWing 1252. 搭配购买 C.AcWing 237. 程序自动分析 D.AcWing 239. 奇偶游戏 E.AcWing 238. 银河英 ...
- 0x41.数据结构进阶 - 并查集
目录 一.路径压缩与按秩合并 1.AcWing 237. 程序自动分析(NOIP2015) 二.边带权并查集 1.AcWing 238. 银河英雄传说(边带权并查集模板) 2.AcWing 239. ...
- 数据结构进阶之并查集
1.初探并查集 例题1:AcWing 237.程序自动分析 这题的思路其实比较好想,只要先考虑所有等于的情况并合并,然后再看不等于的情况,看是否出现矛盾即可.但是这题显然是需要离散化的,但是离散化也很 ...
- 【Acwing并查集】238. 银河英雄传说
238. 银河英雄传说 - AcWing题库 题意: 思路: 并查集维护两个信息:每个连通块的size和每个结点之间的距离 对于连通块的size,只需要在合并的时候维护一下就好了 对于每个结点之间的距 ...
- 并查集——银河英雄传说()
传送门:238. 银河英雄传说 - AcWing题库 思路: 使用并查集可以传递关系的性质,维护一个cnt[i]数组,该数组用于记录以i为跟并查集树下的战舰的数量,用一个d[i]数组表示在i前面的战舰 ...
- 银河英雄传说 acwing-238 并查集
题面链接:238. 银河英雄传说 - AcWing题库 题面: 思路:并查集, 如果没有求两艘战舰之间的战舰数量,这就是一题很简单的并查集 但是这题需要计算两艘战舰之间的数量,我们就需要维护一个d数组 ...
最新文章
- JAVA服务器搭建之问题总结
- 百分点大数据技术团队:乘风破浪 海外数据中台项目实践
- C# 操作XML入门
- DB天气app冲刺第四天
- 常用UI模板,loading框,提醒框,弹框确认框
- 全面理解Java中的String数据类型
- oracle导出超链接,Oracle Report中加入下载超链接操作方法
- ps导出gif颜色不对_PS基础知识(1)
- 简单总结手机app测试,弱网测试
- RabbitMQ小笔记
- 通通玩blend美工(1)——荧光Button
- Python之GUI编程 实现界面化的词云图生成器.exe
- 怎么用别的方法里的变量_微波炉烤鸡翅的方法 怎么用微波炉烤鸡翅
- c语言中 x20是什么意思,转义字符的问题,\ x00- \ x20是什么意思
- 3D角色遮挡住UI的实现,关于Stencil Buffer,描边,以及其他
- twig php函数,TWIG的 function 学习
- 实验管理系统springboot+vue+element ui项目开发
- java区分登陆者的设备(手机还是电脑)
- Java shiro权限管理框架视频教程
- 【Oracle数据库丢失表排查思路】