这是一道带权并查集的题目。

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

因此对于每一次询问,答案就是|d[x]-d[y]|-1.

我们怎样维护这三个数组呢?其中第一个数组的维护很简单,就是并查集的维护,我们重点考虑后两个数组的维护。

在路径压缩时,在把x直接指向树根的同时,我们把d[x]更新为x到树根的距离,这样我们在并查集的find函数中就可以维护d,

而对于size的维护,我们在合并时直接将前一段战舰所在的size加上后一段的size即可。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 using namespace std;
 7 int t;
 8 int f[30010],size[30010],d[300010];
 9 int find(int x) {
10     if(f[x]==x) return x;
11     int xx=find(f[x]);
12     d[x]+=d[f[x]];
13     return f[x]=xx;
14 }
15 int main() {
16     cin>>t;
17     for(int i=1;i<=30000;i++) {
18         size[i]=1;
19         f[i]=i;
20         d[i]=0;
21     }
22     while(t--) {
23         char c;
24         int x,y;
25         cin>>c>>x>>y;
26         int fx=find(x);
27         int fy=find(y);
28         if(c=='M') {
29             f[fx]=fy;
30             d[fx]=size[fy];
31             size[fy]+=size[fx];
32         }
33         else {
34             if(f[x]!=f[y]) puts("-1");
35             else printf("%d\n",abs(d[x]-d[y])-1);
36         }
37     }
38     return 0;
39 }

AC Code

转载于:https://www.cnblogs.com/shl-blog/p/10803705.html

【NOI2002】银河英雄传说相关推荐

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

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

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

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

  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. Google的银河英雄传说

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

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

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

  7. 【并查集】银河英雄传说

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

  8. COdevs 1540 银河英雄传说

    1540 银河英雄传说 source:2002年NOI全国竞赛 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 公元五八○一年, ...

  9. 洛谷 P1196 银河英雄传说

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

最新文章

  1. java calendar与date_Java中date和calendar的用法
  2. SSL 1052——开心的金明
  3. selenium python怎么读_selenium+Python中的面试总结
  4. KMP 算法并非字符串查找的优化 [转]
  5. 用python-opencv实现简单的车牌定位
  6. python安装系统要求_python需要什么系统 | window重装系统教程
  7. IBM斥资3.6亿美元建史上最复杂云计算中心
  8. Android 可拖拽的GridView效果实现, 长按可拖拽和item实时交换
  9. Chrome开发者工具一个有用的快捷键组合:Ctrl+Shift+E
  10. aspose word 获取标题_Word干货|多级标题的自动编号怎么添加?
  11. PHP 社区拒绝在俄乌冲突中“站队”
  12. oracle13001,安装oracle11g 遇到INS-13001环境不知足最低要求 解决方法
  13. java dubbo swagger_Dubbo 的 Swagger 服务文档 swagger-dubbo
  14. Python3.x:生成器简介
  15. C语言求素数的两种方法
  16. 功能磁共振成像统计分析中的 GLM 简介
  17. Python第二次作业——判断句
  18. 网页文档下载不了怎么办 亲测可用!建议收藏!
  19. 武汉大学计算机学院学号代码,武汉大学各专业代码
  20. Android am与pm命令详解

热门文章

  1. maven打包忽略注解_Maven打包时遇到的一些坑和解决方案
  2. html5实现微信支付宝接口,支付宝H5开放文档
  3. PoseNet: A Convolutional Network for Real-Time 6-DOF Camera Relocalization
  4. 创建一个JFrame,可下拉选择显示字符串和图片
  5. Java实现对字符串的快速排序-程序解读
  6. GCN、GAT、凸优化、贝叶斯、MCMC、LDA
  7. 《R语言预测实战》PDF,数据及代码
  8. 【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类...
  9. 常见面试算法:树回归、树剪枝
  10. 使用sklearn进行数据挖掘