所谓带权并查集

本题所求的不止是两个编号之间是否有关系,还要求两个编号之间有什么关系,这就要求我们维护多个数组,fa[]数组维护两个编号之间的连通性,dis[]维护编号为i的战舰到fa[i]之间的距离,num[]维护编号为i的战舰所在的那一列有多少战舰。

find函数

int find(int x){
if(x!=fa[x]){
int k=fa[x];
fa[x]=find(fa[x]);
dis[x]+=dis[k];
num[x]=num[fa[x]];
}
return fa[x];
}

每次find的时候都更新num数组与dis数组

合并函数

void merge(int x,int y){
int r1=find(x),r2=find(y);
if(r1!=r2){
fa[r1]=r2;
dis[r1]=dis[r2]+num[r2];
num[r2]+=num[r1];
num[r1]=num[r2];
}
}

合并时由于是将i号战舰所在的那一列并到j号所在列的尾端,所以dis[r1]=dis[r2]+num[r2]。

询问函数

int query(int a,int b){
int r1=find(a),r2=find(b);
if(r1!=r2){
return -1;
}else {
return abs(dis[a]-dis[b])-1;
}
}

注意返回时要加一

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=30005;
int read(){
int rv=0,fh=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
rv=(rv<<1)+(rv<<3)+c-'0';
c=getchar();
}
return rv*fh;
}
int fa[MAXN],dis[MAXN],t,num[MAXN];
int find(int x){
if(x!=fa[x]){
int k=fa[x];
fa[x]=find(fa[x]);
dis[x]+=dis[k];
num[x]=num[fa[x]];
}
return fa[x];
}
void merge(int x,int y){
int r1=find(x),r2=find(y);
if(r1!=r2){
fa[r1]=r2;dis[r1]=dis[r2]+num[r2];
num[r2]+=num[r1];
num[r1]=num[r2];
}
}
int query(int a,int b){
int r1=find(a),r2=find(b);
if(r1!=r2){
return -1;
}else {
return abs(dis[a]-dis[b])-1;
}
}
int main(){
freopen("in.txt","r",stdin);
t=read();
for(int i=1;i<=MAXN;i++) {fa[i]=i;num[i]=1;}
for(int i=1;i<=t;i++){
char c;
scanf(" %c ",&c);
int a=read(),b=read();
if(c=='M'){
merge(a,b);
}else {
printf("%d\n",query(a,b));
}
} fclose(stdin);
return 0;
}

洛谷 [p1196] 银河英雄传说的更多相关文章

  1. NOI2002 洛谷 P1196 银河英雄传说

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

  2. 洛谷—— P1196 银河英雄传说

    https://www.luogu.org/problem/show?pid=1196 题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始 ...

  3. 洛谷P1196 银河英雄传说

    大意:你有30000个队列,第i个队列中只有i 有T个操作,1,把某个队列头接到另一个队列尾. 2,问两个元素之间的距离. 本题主要有三种解法. ①带权并查集. 具体来说就是,并查集维护当前集合的大小 ...

  4. [洛谷P4847]银河英雄传说V2

    题目大意:有$n(n\leqslant2\times10^5)$个序列,有$m(m\leqslant2\times10^5)$个操作,分三种: 1. $M\;x\;y:$把$x$所在的序列放在$y$所 ...

  5. Luogu P1196 银河英雄传说

    Luogu P1196 银河英雄传说 我们考虑用并查集来维护战舰的情况. 同时,我们用一个$d$数组来记录$x$与$fa[x]$之间的距离.再用$size$数组记录战舰当前所在列的战舰数. 易知两艘在 ...

  6. 加权并查集(银河英雄传说,Cube Stacking)

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

  7. NOI2002_ Galaxy银河英雄传说86

    NOI2002_ Galaxy银河英雄传说86     公元五八○一年,地球居民迁移至金牛座α第二行星,:宇宙历七九九年,银河系的两大军事集团在巴米利恩星:杨威利擅长排兵布阵,巧妙运用各种战术屡次以少 ...

  8. P4847 银河英雄传说V2 题解(Splay)

    题目链接 P4847 银河英雄传说V2 解题思路 我天哪!!!\(splay\)在\(rotate\)的时候先\(upd(y)\)再\(upd(x)\)!!以后不能再因为这个\(WA\)一晚上了!!! ...

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

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

随机推荐

  1. 冒泡排序和选择排序-java

    冒泡排序 假设有一数组int [] arr  = {9,5,4,10,2};原理是第一个元素和第二个比较,如果前者大于后者便交换位置,然后第二个元素和第三个元素比较,如果前者大于后者便交换位置.以此类 ...

  2. Spark算子--cogroup

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/b612b1e6d9b951fad5574cd0ce573d7e.html cogroup--Transform ...

  3. Tp框架查询分页显示与全部查询出来显示运行时间快慢有区别吗?

    8:08:01 青春阳光 2017/4/7 8:08:01 大神在吗? Tp框架查询分页显示与全部查询出来显示运行时间快慢有区别吗? 青春阳光 2017/4/7 8:08:20 还有个问题,上传到pu ...

  4. vueThink权限配置

    vueThink中的 admin 默认是展示所有权限,其他的权限组用户就要自己去特定进行配置 http://vuedemo.cn:8181 这里我是默认本地配置了apache到  php\public ...

  5. 如何解决wamp中apache外部IP访问问题

    # # Some examples: #ErrorDocument 500 "The server made a boo boo." #ErrorDocument 404 /mis ...

  6. 003_JS基础_面向对象基础

    3.1 对象   引入:在js中表示一个人的信息(name, gender, age)通过var申明三个变量,但是这样使用基本数据类型的变量,他们是互相独立的,没有联系:  此时就需要使用对象,对象是 ...

  7. IT术语的正确读法

    Linux /ˈlɪnəks/ /ˈlɪnʊks/(EU) Linux 是一类 Unix 计算机操作系统的统称.该操作系统的核心的名字也是“ Linux” .参考: < !-- m --> ...

  8. PostgreSql 分页limit

    摘录自:http://jingyan.baidu.com/article/a17d528538119b8098c8f2ca.html 语法: select * from persons limit   ...

  9. Java数据持久层框架 MyBatis之API学习三(XML 映射配置文件)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  10. 2017-07-08( bzip2 bunzip mount)

    .bz2 压缩格式  不能压缩目录 bzip2  源文件  (不保留源文件) bzip2 -k  源文件 (保留源文件) bzip2 -d  压缩文件名  (-k保留压缩文件) bunzip  压缩文 ...