P1196 银河英雄传说

P1196 [NOI2002] 银河英雄传说——并查集 题解 300001,2,…,含义为第 i 号战舰所在的整个战舰队列,作为一个整体(头在前尾在后)接至第 j 号战舰所在的战舰队列的尾部。:i 和 j 是两个整数(1≤i,j≤30000),表示指令涉及的战舰编号。该指令是莱因哈特窃听到的杨威利发布的舰队调动指令,并且保证第 i 号战舰与第 j 号战舰不在同一列。该指令意思是,询问电脑,杨威利的第 i 号战舰与第 j 号战舰当前是否在同一列中,如果在同一列中,那么它们之间布置有多少战舰。:i 和 j 是两个整数(1≤i,j≤30000),表示指令涉及的战舰编号。 阅读详情

P1196 银河英雄传说

今天上课有点烦躁,不太想写代码了,水一篇题解;大佬路过点赞昂,谢谢各位大佬

题目背景

公元 5801 年,地球居民迁至金牛座 𝛼 第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展。宇宙历 799 年,银河系的两大军事集团在巴米利恩星域爆发战争。泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌。

题目描述

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

在杨威利发布指令调动舰队的同时,莱因哈特为了及时了解当前杨威利的战舰分布情况,也会发出一些询问指令:C i j。该指令意思是,询问电脑,杨威利的第
𝑖 号战舰与第 𝑗 号战舰当前是否在同一列中,如果在同一列中,那么它们之间布置有多少战舰。
作为一个资深的高级程序设计员,你被要求编写程序分析杨威利的指令,以及回答莱因哈特的询问。

输入格式

第一行有一个整数
𝑇(1≤𝑇≤5×10**5),表示总共有 𝑇 条指令。以下有 𝑇 行,每行有一条指令。指令有两种格式:M i j:𝑖 和 𝑗 是两个整数(1≤𝑖,𝑗≤30000),表示指令涉及的战舰编号。该指令是莱因哈特窃听到的杨威利发布的舰队调动指令,并且保证第 𝑖 号战舰与第 𝑗 号战舰不在同一列。C i j:𝑖 和 𝑗 是两个整数(1≤𝑖,𝑗≤30000),表示指令涉及的战舰编号。该指令是莱因哈特发布的询问指令。

这道题是一道经典的并查集的题目,以及并查集的一些的应用:加权并查集等等
首先在开始写这道题之前我们要了解一些东西:首先是加权并查集,比如在一个并查集下,我要找到任意元素距离其祖先的距离,而我们知道的只有每个元素和他的·pre是啥。
在这里插入图片描述

int find(int x)//在并查集的基础模板上进行
{
	if(x != pre[x]) 
	{
		int t = pre[x];//首先对pre进行备份确保这是直接的父亲
		pre[x] = find(pre[x]);//之后再对pre进行保存
		d[x] += d[t];//加上直接前驱
	}
	return pre[x];
}

而在这之后我们依照题目可以知道我们需要的是i与j之间战舰的数量,那么这里我提供一个思路给大家,就利用这个距离来算,我们可以通过两者距离他们祖先的距离的差值来算出之间战舰数量的多少,但是这里有一个关键性的问题,就是这个链接的有点问题,因为我们必须要接在这段的最尾端那么问题来了,怎样才能保证我们接的是最未段呢?我们写过并查集的都知道我们链接两个集合用的是pre[px] = py;这根本不能达成目的,那么该怎么办呢?

当然是用那个size,通过计算集合的大小在加在他的px上这样可以使距离上与接在末端无异;

在这里插入图片描述
字有点丑^ _ ^
就是把原size接到后边就Ok啦
ac代码:

#include<bits/stdc++.h>
using namespace std;

const int N = 3001000;
int pre[N], n, i, j, si[N], d[N];
char op;
int find(int x)
{
	if(x != pre[x]) 
	{
		int t = pre[x];
		pre[x] = find(pre[x]);
		d[x] += d[t];
	}
	return pre[x];
}
int main()
{
	cin >> n;
	for(int i = 1; i <= n; i ++)
	{
		pre[i] = i;
		d[i] = 0;
		si[i] = 1;
	}
	while(n --)
	{
		cin >> op >> i >> j;
		
		int pi = find(i);
		int pj = find(j);
		if(op == 'M')
		{
			d[pi] += si[pj];
			pre[pi] = pj;
			si[pj] += si[pi];
			si[pi] = 0;
		}
		else if(op == 'C')
		{
			if(pi != pj) cout << -1 << endl;
			else cout << abs(d[i] - d[j]) - 1 << endl;
		}
	}
	return 0;
}
并查集+树高【P1196 [NOI2002] 银河英雄传说】 阅读详情

相关推荐

英飞凌TC397芯片时钟树详解:从EB-tresos配置到PLL锁相环实战避坑

本文详细解析了英飞凌TC397芯片的时钟树架构,从EB-tresos配置到PLL锁相环的实战应用,帮助工程师避免常见配置陷阱。文章深入探讨了时钟源层、频率转换层和分配网络层的设计原理,提供了PLL配置的数学公式和EB-tresos关键容器的配置要点,并分享了调试技巧与性能优化实践,适用于MCU开发中的时钟管理需求。

weixin_42524226的博客 212

洛谷 P1196 [NOI2002]银河英雄传说【带权并查集】

题目背景 公元 5801 年,地球居民迁至金牛座 α\alphaα 第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展。 宇宙历 799 年,银河系的两大军事集团在巴米利恩星域爆发战争。泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌。 题目描述 杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气。在这次决战中,他将巴米利恩星域战场划分成 300003000030000 列,每列依次编号为 1,2,…,300

memcpy0的博客 683

3D Slicer:从入门到精通——数据模块之DICOM

该模块允许导入、导出和网络传输DICOM数据。Slicer支持DICOM功能的常用子集,其特定功能由临床研究的需求驱动:从磁盘读取和写入数据集,并通过DIMSE和DICOMweb网络协议进行网络传输——查询检索发送和接收数据集。医学数字成像和通信(DICOM)是信息交换数字放射学的广泛使用标准。在大多数情况下,医院使用的成像设备(CT和MR扫描仪)将生成保存为DICOM对象的图像。DICOM按以下层次结构组织数据患者… 可以有1个或多个研究(单次成像检查) … 可以有1个或多个系列。

walt3433的博客 6066

Turtle Puzzle: Rearrange and Negate(Round 929)

【代码】Turtle Puzzle: Rearrange and Negate(Round 929)

GordrnGhost的博客 878

ZYNQ裸机LWIP双网口实现

文章目录前言一、LWIP双网口二、使用步骤1.部分说明2.部分代码总结 前言 一、LWIP双网口 由于项目需要多通讯口,查阅资料发现lwip支持多网口操作。于是,就开搞了。 二、使用步骤 1.部分说明 利用xemac_add函数在网卡链表中添加一个网卡,即使用netif块重复xemac_add操作。 先用轮询的方式实现双网口,后期修改为中断模式 2.部分代码 导入官方例程LWip echo server, 修改main函数,增加一个netif块 #if LWIP_IPV6==0 #if L..

weixin_35865280的博客 1万+

【系统架构设计师】预测试卷一:综合知识(75道选择题)

软件架构风格是描述某一特定应用领域中系统组织方式的惯用模式,架构风格反映领域中众多系统所共有的结构和 (48),强调对架构(49)的重用。 (48) A. 语义特性 B. 功能需求 C. 质量属性 D. 业务规则 (49) A. 分析 B. 设计 C.实现

数据知道的博客 7766

银河英雄传说-并查集

有一个划分为N列的星际战场,各列依次编号为1,2,…,N。 有N艘战舰,也依次编号为1,2,…,N,其中第i号战舰处于第i列。 有T条指令,每条指令格式为以下两种之一: 1、M i j,表示让第i号战舰所在列的全部战舰保持原有顺序,接在第j号战舰所在列的尾部。 2、C i j,表示询问第i号战舰与第j号战舰当前是否处于同一列中,如果在同一列中,它们之间间隔了多少艘战舰。 现在需要你编写一个程序,处...

qq_45772483的博客 292

HFSS 3D Layout仿真PCB操作说明

本文介绍一种特别适合PCB这种叠层结构的仿真软件,HFSS 3D Layout既有操作的简便性,又有同3D软件仿真所有的精确性,仿真速度上又比3D软件快很多。

sinat_15150363的博客 3942

p1196【NOI2002】银河英雄传说

所谓带权并查集 本题所求的不止是两个编号之间是否有关系,还要求两个编号之间有什么关系,这就要求我们维护多个数组,fa[]数组维护两个编号之间的连通性,re[]维护编号为i的战舰到fa[i]之间的距离,num[]维护编号为i的战舰所在的那一列有多少战舰。 #include<cstdio> #include<algorithm> #include<iostream>...

weixin_45885433的博客 357

面向精准医疗的多模态影像融合:实现前列腺MRI与大病理切片的三维配准与空间重建研究

亲爱的同学,当你能完整实现“前列腺MRI与大病理组织学图像的3D配准及体素重建”,你会发现医学影像交叉领域的毕设课题充满挑战与乐趣。我们将从临床需求出发,拆解3D配准与体素重建的核心技术,带你从原理到代码实现完整流程,让你的毕设不仅能顺利完成,更能体现临床应用价值。,让MRI和病理图像在同一空间对齐,能实现“术前影像-术后病理”的精准关联,为前列腺癌的精准诊疗、预后评估提供关键依据——这一课题既有技术挑战性,又有临床意义,是毕设的优质选择。(如NCC、Dice、配准时间),用数据证明方法的优越性。

m0_71589036的博客 4717

YOLOv11全方位改进指南:卷积层、轻量化、注意力、损失函数等创新优化一览

YOLOv11通过八大核心模块的创新设计,在保持YOLO系列实时性的同时显著提升检测精度。本文提出的可变形卷积DCNv4多模态注意力动态解耦头等创新方案,已在工业质检、自动驾驶、无人机巡检等领域成功应用。完整项目地址预训练模型:包含从nano到x六个规格在线演示创新声明首次在YOLO系列集成DCNv4,小目标检测AP提升8.2%提出多模态混合注意力(MMAttention),兼顾通道与空间关系动态标签分配策略使训练效率提升40%

QQ_778132974的博客 1019

题解 洛谷P1196 【[NOI2002]银河英雄传说】

题意 有一个划分成n列的星际战场,各列编号为1,2.....n。有n艘战舰,也依次编号1,2.....n,其中第i号战舰位于第i列。 有m条指令,每条指令格式如下 M i j 表示让第i号战舰所在列的全部战舰保持原有顺序,接在第j艘战舰的尾部。 C i j 表示询问第i艘战舰和第j艘战舰当前是否再同一列中,如果再同一列中,它们之间隔了多少艘战舰。 N<=30000,M<=...

aqg41577的博客 282

基于Simulink的无线充电系统LCC补偿网络建模与控制

本文详细介绍了基于Simulink的无线充电系统LCC补偿网络建模与控制方法。首先分析了LCC补偿网络的恒流输出、软开关实现和抗偏移能力等优势,并对比了不同补偿拓扑特性。随后分步骤讲解了Simulink建模流程,包括LCC主电路构建、关键参数设计、双闭环控制系统实现等核心环节。重点阐述了移相控制策略和软开关验证方法,提供了系统效率计算和抗偏移测试的调试技巧。最后展示了仿真结果,在耦合系数变化20%时,闭环系统仍能保持输出电压稳定在±2%波动范围内。文章还探讨了工程扩展方向,并针对常见问题给出了解决方案,为无

xiaoheshang_123的博客 539

洛谷 P1196 银河英雄传说

P1196 银河英雄传说 加权并查集,简介见点击打开链接,具体方法见代码及注释 //P1196 银河英雄传说 #include int fa[30010]; int r[30010];//r[i]表示第i号战舰在其父亲之后的第r[i]个位置 int r2[30010];//r2[i]表示以第i号战舰为队首的队列有r2[i]辆战舰 //本来只想到了记录战舰i后面的战舰数量,但是操作量太大,这

642

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

洛谷 P1196 [NOI2002]银河英雄传说 带权并查集

洛谷 P1196 [NOI2002]银河英雄传说 带权并查集 题解: 本题所求的不止是两个编号之间是否有关系,还要求两个编号之间有什么关系,这就要求我们维护多个数组,fa[]数组维护两个编号之间的连通性,dis[]维护编号为i的战舰到fa[i]之间的距离,num[]维护编号为i的战舰所在的那一列有多少战舰。 代码如下: #include<iostream> #include<al...

化身孤岛的鲸o的博客 442

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

每日一题005-并查集-洛谷p1196银河英雄传说

公元5801年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展。宇宙历799年,银河系的两大军事集团在巴米利恩星域爆发战争。泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌。

zjh的博客 1453

洛谷P1196 银河英雄传说

☞洛谷P1196 银河英雄传说☜ 大意 有一个矩阵,一开始每个矩阵上有一个战舰,有t

Ajwallet 540

#洛谷oj:P1196银河英雄传说

** 洛谷oj:P1196银河英雄传说 ** #题目描述 #并查集的题 #注意并查集就是只能一次更新一个的位置信息 如果更新一段就没有意义了 #知识点 并查集 #代码 第1次 更新一段了 就没有意义了 超时了 #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<stdio.h> using namespace std; #define

resting_xiub的博客 215

P1196 [NOI2002] 银河英雄传说

原题链接: [NOI2002] 银河英雄传说 - 洛谷https://www.luogu.com.cn/problem/P1196 题目背景 公元5801年,地球居民迁至金牛座 α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展。 宇宙历799 年,银河系的两大军事集团在巴米利恩星域爆发战争。泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌。 题目描述 杨威利擅长排兵布阵,巧妙运用各种...

zhu_yin233的博客 555

洛谷P1196银河英雄传说

洛谷1196 银河英雄传说本题地址: http://www.luogu.org/problem/show?pid=1196题目描述 杨威利在 这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …,30000。之后,他把自己的战舰也依次编号为1, 2, …, 30000,让第i号战舰处于 第i列(i = 1, 2, …, 30000),形成“一字长蛇阵”,诱敌深入。这是

辣鸡退役选手的博客 1085

洛谷P1196 [NOI2002] 银河英雄传说

有30000条队列,总共n次操作,分M操作与C操作,M操作是把当前第i艘飞船所在的整条队列移到第j艘飞船艘所在的队列的最后面,C操作则是询问第i艘飞船与第j艘飞船是否在同一条队列,如果在则输出第i艘飞船与第j艘飞船之间的飞船数,不包括i和j,题目不保证j在i后面,否则就输出。先来分析一下这些指令的特点,很容易发现对于每个M指令,只可能一次移动整个队列,并且是把两个队列首尾相接合并成一个队列,不会出现把一个队列分开的情况,因此,我们必须要找到一个可以一次操作合并两个队列的方法。

喷火龙廖的博客 1126

「洛谷」P1196 银河英雄传说

P1196 银河英雄传说 https://www.luogu.com.cn/problem/P1196 题目描述 杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气。在这次决战中,他将巴米利恩星域战场划分成 30000 列,每列依次编号为 1,2,…,300001, 2,\ldots ,300001,2,…,30000。之后,他把自己的战舰也依次编号为 1,2,…,300001, 2, \ldots , 300001,2,…,30000,让第 i 号战舰处于第 i 列,形成“一字长蛇阵”,诱

XiaoLing 一直摆烂哇! 802

边带权并查集 学习笔记 & 洛谷P1196 [NOI2002] 银河英雄传说 题解

花了2h总算把边带权并查集整明白了qaq 1.边带权并查集的用途 众所周知,并查集擅长维护与可传递关系有关的信息。然而我们有时会发现并查集所维护的信息不够用,这时“边带权并查集”就应运而生了。 2.例题与思路 这里通过例题 洛谷P1196 [NOI2002] 银河英雄传说 来介绍边带权并查集的思想。题面请点击链接查看。 2.1.暴力 拿到这道题我的第一想法就是用链表模拟。对于两艘在同一列的战舰,...

qq_14886903的博客 281

P1196 [NOI2002]银河英雄传说

P1196 [NOI2002]银河英雄传说 题意 略(中文) 思路 边带权并查集,用front[i]记录i到根节点之间有多少艘战舰,num[i]表示第i列有多少艘战舰. 代码 #include<bits/stdc++.h> using namespace std; const int maxn=3e4+10; int num[maxn],front[maxn],fa[maxn]...

Do It Youself! 207

【题解】洛谷P1196[NOI2002]银河英雄传说 带权并查集

题目链接 改了快一个小时过不了样例,交上去AC了……可能这就是权贵吧 #include&amp;lt;cstdio&amp;gt; #include&amp;lt;cmath&amp;gt; #define _rep(i,a,b) for(int i=(a);i&amp;lt;=(b);i++) using namespace std; const int N=3e4+10; int t; int fa[N],d[N],size[N...

翻过这座山,他们就会听到你的故事 333
上一篇: P1314 聪明的质检员 二分 与 前缀和 方法
下一篇: 【Unity】简单象棋项目开发
GameCrafter-游戏工匠
博客等级 码龄3年 165粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值