银河英雄传说
来源:互联网 发布:js时间控件使用 编辑:程序博客网 时间:2024/04/28 05:49
题目描述 Description
公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展。
宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争。泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌。杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气。在这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …, 30000。之后,他把自己的战舰也依次编号为1, 2, …, 30000,让第i号战舰处于第i列(i = 1, 2, …, 30000),形成“一字长蛇阵”,诱敌深入。这是初始阵形。当进犯之敌到达时,杨威利会多次发布合并指令,将大部分战舰集中在某几列上,实施密集攻击。合并指令为M i j,含义为让第i号战舰所在的整个战舰队列,作为一个整体(头在前尾在后)接至第j号战舰所在的战舰队列的尾部。显然战舰队列是由处于同一列的一个或多个战舰组成的。合并指令的执行结果会使队列增大。然而,老谋深算的莱因哈特早已在战略上取得了主动。在交战中,他可以通过庞大的情报网络随时监听杨威利的舰队调动指令。在杨威利发布指令调动舰队的同时,莱因哈特为了及时了解当前杨威利的战舰分布情况,也会发出一些询问指令:C i j。该指令意思是,询问电脑,杨威利的第i号战舰与第j号战舰当前是否在同一列中,如果在同一列中,那么它们之间布置有多少战舰。作为一个资深的高级程序设计员,你被要求编写程序分析杨威利的指令,以及回答莱因哈特的询问。最终的决战已经展开,银河的历史又翻过了一页……
输入描述 Input Description
输入文件galaxy.in的第一行有一个整数T(1<=T<=500,000),表示总共有T条指令。
以下有T行,每行有一条指令。指令有两种格式:
M i j :i和j是两个整数(1<=i , j<=30000),表示指令涉及的战舰编号。该指令是莱因哈特窃听到的杨威利发布的舰队调动指令,并且保证第i号战舰与第j号战舰不在同一列。
C i j :i和j是两个整数(1<=i , j<=30000),表示指令涉及的战舰编号。该指令是莱因哈特发布的询问指令。
输出描述 Output Description
输出文件为galaxy.out。你的程序应当依次对输入的每一条指令进行分析和处理:
如果是杨威利发布的舰队调动指令,则表示舰队排列发生了变化,你的程序要注意到这一点,但是不要输出任何信息;
如果是莱因哈特发布的询问指令,你的程序要输出一行,仅包含一个整数,表示在同一列上,第i号战舰与第j号战舰之间布置的战舰数目。如果第i号战舰与第j号战舰当前不在同一列上,则输出-1。
样例输入 Sample Input
4
M 2 3
C 1 2
M 2 4
C 4 2
样例输出 Sample Output
-1
1
#include<iostream>#include<cstdlib>using namespace std;int f[30005],before[30005],count[30005],a[500005];int getfather(int x) 路径压缩{ int ff; if (f[x]==x) return x; else { ff=getfather(f[x]); before[x]=before[x]+before[f[x]];];{这里是关键} f[x]=ff; return ff; }}int merge(int x,int y)归并操作{ int x1,y1; x1=getfather(x);y1=getfather(y); f[x1]=y1; before[x1]+=count[y1]; count[y1]+=count[x1];}int main(){ int t=0; for (int i=1;i<=30000;++i) { count[i]=1; f[i]=i; before[i]=0; } int n; cin>>n; for (int i=1;i<=n;++i) { int x,y;char z; cin>>z>>x>>y; if (z=='M') { merge(x,y); } else { if (getfather(x)!=getfather(y)) { ++t; a[t]=-1; } else { ++t; a[t]=abs(before[x]-before[y])-1; } } } for (int i=1;i<=t;++i) cout<<a[i]<<endl;}这一题需要增加两个域,一个表示该元素所在集合中元素的总个数,用count表示;另一个是在该集合中,这个元素之前有多少个元素,用before表示。初始的时候father[i] := i;count[i] := 1; before[i] := 0;
2 0
- TYVJ 银河英雄传说
- 【noi2002】银河英雄传说
- Noi2002银河英雄传说
- 【NOI2002】银河英雄传说
- 【codevs1540】 银河英雄传说
- 银河英雄传说
- 【u010】银河英雄传说
- 1540 银河英雄传说
- P1196 银河英雄传说
- [P1196]银河英雄传说
- 银河英雄传说
- NOI2002 银河英雄传说
- NOI2002 银河英雄传说
- 银河英雄传说
- NOI2002-银河英雄传说
- [codevs1540]银河英雄传说
- 【NOI2002】银河英雄传说
- Codevs1540银河英雄传说
- Scala的内建控制结构
- 机房结账和上下机方面的理解
- 程序员创业的瓶颈及破解方法
- angularJS post请求后台接收不到参数
- tensorflow设备内存分配算法解析 (BFC算法)
- 银河英雄传说
- 语音识别系统及科大讯飞最新实践
- VS2013配置OpenCV2.4.9出现fatal error LNK1104:无法打开文件kernel32.lib的解决方法
- 线程池模块分析 (CPU thread pool device)
- MatMul 矩阵乘积运算 (前向计算,反向梯度计算)
- 数据结构实验之排序四:寻找大富翁
- Objective-C:dealloc、组合与聚合
- 处理String特殊符号
- MFC入门(一)-- 第一个简单的windows图形化界面小程序(打开计算器,记事本,查IP)