题意

有一个划分成n列的星际战场,各列编号为1,2.....n。有n艘战舰,也依次编号1,2.....n,其中第i号战舰位于第i列。

有m条指令,每条指令格式如下

  1. M i j 表示让第i号战舰所在列的全部战舰保持原有顺序,接在第j艘战舰的尾部。

  2. C i j 表示询问第i艘战舰和第j艘战舰当前是否再同一列中,如果再同一列中,它们之间隔了多少艘战舰。

N<=30000,M<=5* \(10^5\)

一道简单的并查集,一条链也是一棵树,只不过是树的特殊形态,因此可以把每一列战舰看作一个集合用并查集维护。最初,N个战舰构成N个独立的集合。

在没有路径压缩的情况下fa[x]就代表排在x前面那艘战舰的编号,一个集合的代表就是位于前面的战舰,另外让树上每条边带权值1,这样树上两点之间的距离-1就是二者之间间隔的战舰数量

在考虑路径压缩的情况下,我们额外建立一个数组d,d[x]记录战舰x与fa[x]之间的边的权值。在路径压缩把x直接指向树根的同时,我们把d[x]更新为从x到树根的路径上的所有边权之和,下面的代码对Get函数稍价修改,即可实现对d数组的维护。

int get(int x){
if(x==fa[x]) return x;
int root=get(fa[x]); //递归计算集合代表
d[x]+=d[fa[x]];//维护数组d
return fa[x]=root;//路径压缩
}

当收到 C x y 指令时分别执行 get(x)和get(y)完成查询和路径压缩,当二者的返回值相同时,则说明x,y在同一列。因为x和y此时都已经指向树根,所以d[x]保存了位于x之前的战舰数量,d[y]保存了位于y之前的战舰数量,两者之差的绝对值再减去1就是x,y之间相隔的战舰数量。

当收到 M x y 指令时把x的树根作为y的树根的子节点,连接的新边的权值应该设为合并之前集合y的大小(由题意,集合y中的所有战舰都在集合x之前),因此我们还需要一个size数组在每个树根上记录集合大小。

void merge(int x,int y){
x=get(x);y=get(y);
fa[x]=y;d[x]=size[y];
size[y]+=size[x];
}

代码

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
const int maxn=30010;
int T,fa[maxn],d[maxn],size[maxn];
int get(int x){
if(x==fa[x]) return x;
int root=get(fa[x]);
d[x]+=d[fa[x]];
return fa[x]=root;
}
int main(){
for(int i=1;i<=maxn;++i){
fa[i]=i;
size[i]=1;
}
scanf("%d",&T);
while(T--){
char k[2];
int u,v;
scanf("%s",k);
scanf("%d%d",&u,&v);
int fa1=get(u);
int fa2=get(v);
if(k[0]== 'M'){
fa[fa1]=fa2;
d[fa1]=size[fa2];
size[fa2]+=size[fa1];
}
else{
if(fa1!=fa2) printf("-1\n");
else printf("%d\n",abs(d[u]-d[v])-1);
}
}
return 0;
}

题解 洛谷P1196 【[NOI2002]银河英雄传说】的更多相关文章

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

    花了2h总算把边带权并查集整明白了qaq 1.边带权并查集的用途 众所周知,并查集擅长维护与可传递关系有关的信息.然而我们有时会发现并查集所维护的信息不够用,这时"边带权并查集"就 ...

  2. [洛谷P1196][NOI2002]银河英雄传说 - 带偏移量的并查集(1)

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

  3. 洛谷P1196[NOI2002]银河英雄传说-并查集扩展

    银河英雄传说 题意:在并查集的基础上,还要求出同一集合的两个点的距离 这道题用并查集自己是知道的,但是竟然可以这么骚的操作. 下面转自大佬的查详细题解 初见这道题,首先想到的方法当然是直接模拟,模拟每 ...

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

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

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

    P1196 [NOI2002]银河英雄传说 题目大意: 给你一个序列,支持两种操作: 合并指令为$M_{i,j}$j​,含义为第i号战舰所在的整个战舰队列,作为一个整体(头在前尾在后)接至第j号战舰所 ...

  6. 洛谷 1196 [NOI2002]银河英雄传说【模板】带权并查集

    [题解] 经典的带权并查集题目. 设cnt[i]表示i前面的点的数量,siz[i]表示第i个点(这个点是代表元)所处的联通块的大小:合并的时候更新siz.旧的代表元的cnt,路径压缩的时候维护cnt即 ...

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

    题意简述 有30000列,每列都有一艘战舰,编号1~30000 有2种操作: 1.将一列的战舰运到另一列 2.询问两个战舰是否在同一列,如果是,求出它们之间的距离 题解思路 并查集, 维护每个点x离自 ...

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

    #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #includ ...

  9. 洛谷 P1196 【银河英雄传说】

    这道题其实就是一个带权并查集的基础题,维护的是点权,所以我们要维护两个数组dis:表示当前点到父亲节点的距离,size:当前子树的大小.那么程序就自然出来了: 代码: #include <bit ...

随机推荐

  1. DesignPattern系列__02接口隔离原则

    介绍 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小接口上. Demo引入 先来看一张图: interface MyInterface { void operation1(); ...

  2. Python基础总结之认识lambda函数、map函数、filter() 函数。第十二天开始(新手可相互督促)

    今天周日,白天在学习,晚上更新一些笔记,希望对大家能更好的理解.学习python~ lambda函数,也就是大家说的匿名函数.它没有具体的名称,也可以叫做一句话函数,我觉得也不过分,大家看下代码,来体 ...

  3. LR有的JMeter也有之一“参数化”

    酝酿了几天,一直想写点JMeter的东西,算是对学习东西的一个整理.:) 恩,一直觉得自己领悟能力不强,别人写的东西总要看老半天也不懂.好吧!一惯的傻瓜的方式(大量的截图+参数说明)嘻嘻. 参数化:简 ...

  4. 【算法】【排序】【交换类】快速排序QuickSort

    #include<stdio.h> //快速排序 int main(){ ,,,,,,,,}; +; //基准指针 ; //慢指针 int* j=a; //快指针 int QS(int* ...

  5. java随笔之接口

    /* * 接口大致上可以分为:哑接口,抽象接口,接口类 * 哑接口:就是public,protected(注意protect有包权限,只有本包才开放接口)方法 * 抽象接口:就是哑接口变为抽象方法,在 ...

  6. jdk1.8 HashMap底层数据结构:深入解析为什么jdk1.8 HashMap的容量一定要是2的n次幂

    前言 1.本文根据jdk1.8源码来分析HashMap的容量取值问题: 2.本文有做 jdk1.8 HashMap.resize()扩容方法的源码解析:见下文“一.3.扩容:同样需要保证扩容后的容量是 ...

  7. java多线程中wait/notify/sleep/join/yield方法以及多线程的六种状态

    刚开始学线程的时候也是被这几个方法搞的云里雾里的,尤其是一开始看的毕老师的视频,老师一直在强调执行权和执行资格,看的有点懵逼,当然不是说毕老师讲的不好,就是自己有点没听明白,后来复习看了一些其他的博客 ...

  8. javacv——读取摄像头的图像、截取视频的画面

    javacv开发包是用于支持java多媒体开发的一套开发包,可以适用于本地多媒体(音视频)调用以及音视频,图片等文件后期操作(图片修改,音视频解码剪辑等等功能). 这些需要引入的包.音视频处理使用ff ...

  9. 谈谈我对Ext的认识,元芳,你怎么看

    实用Ext第一步当然是引用jar包啦. 下载地址 在页面上加上div用于显示这也是必须的 <div id='loginpanel' ></div> 在js中我们肯定需要将Ext ...

  10. javaScript基础-03 javascript语句

    一. 声明语句 var和function都是声明语句.声明或定义变量或函数. var 声明一个或者多个变量.语法如下: var a ; var b = 1; var c, d; var e = 3; ...