边带权并查集 学习笔记 & 洛谷P1196 [NOI2002] 银河英雄传说 题解
花了2h总算把边带权并查集整明白了qaq
1.边带权并查集的用途
众所周知,并查集擅长维护与可传递关系有关的信息。然而我们有时会发现并查集所维护的信息不够用,这时“边带权并查集”就应运而生了。
2.例题与思路
这里通过例题 洛谷P1196 [NOI2002] 银河英雄传说 来介绍边带权并查集的思想。题面请点击链接查看。
2.1.暴力
拿到这道题我的第一想法就是用链表模拟。对于两艘在同一列的战舰,只需知道它们到队首的距离(设距离分别为 \(dis_1\) 和 \(dis_2\))就可以知道它们之间的距离(为 \(|dis_1-dis_2|+1\))。对于每艘战舰,记录它前面的战舰是哪一艘,查询时通过暴力往前跳来查询 \(dis_1\) 和 \(dis_2\),合并时暴力合并。这样显然会超时,于是我们考虑优化。
2.2.优化
可以考虑使用路径压缩的方式进行优化。对于这样一个链表:
它等价于:
同时这样查询时要跳的步数就少很多。这其实就是路径压缩。
同时我们还需要记录每一列的战舰数,在合并时只需要:
就可以了。
单次操作时间复杂度和并查集一模一样,是 \(\Theta(\alpha(n))\) 的,非常高效。
2.3.Code
废话少说,放码过来!
#include <bits/stdc++.h>
using namespace std;
#define MAXN 30000
int t,fa[MAXN+5],dis[MAXN+5]/*到父亲战舰之间隔了多少战舰*/,siz[MAXN+5]/*每一列的战舰数*/;
int get(int x){//查询
if(fa[x]==x){
return x;
}else{
int res=get(fa[x]);
dis[x]+=dis[fa[x]];//路径压缩
fa[x]=res;
return res;
}
}
int main(){
ios::sync_with_stdio(false);
for(int i=1;i<=MAXN;i++){
fa[i]=i;
siz[i]=1;
}
cin>>t;
while(t--){
string op;cin>>op;
if(op=="M"){//合并
int i,j;cin>>i>>j;
i=get(i);j=get(j);
dis[i]+=siz[j];
fa[i]=j;
siz[j]+=siz[i];
siz[i]=0;
}else{
int i,j;cin>>i>>j;
if(get(i)!=get(j)){
cout<<-1<<endl;
}else{
cout<<abs(dis[i]-dis[j])-1<<endl;
}
}
}
return 0;
}
据说还有一个扩展域并查集,回头博主再了解一下,现在博主要去恰饭了
边带权并查集 学习笔记 & 洛谷P1196 [NOI2002] 银河英雄传说 题解的更多相关文章
- 洛谷P1196 [NOI2002]银河英雄传说(带权并查集)
题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...
- [洛谷P1196][NOI2002]银河英雄传说 - 带偏移量的并查集(1)
Description 公元五八〇一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发 ...
- 洛谷P1196[NOI2002]银河英雄传说-并查集扩展
银河英雄传说 题意:在并查集的基础上,还要求出同一集合的两个点的距离 这道题用并查集自己是知道的,但是竟然可以这么骚的操作. 下面转自大佬的查详细题解 初见这道题,首先想到的方法当然是直接模拟,模拟每 ...
- P2661 信息传递[最小环+边带权并查集]
题目来源:洛谷 题目描述 有 n 个同学(编号为 1 到 n )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti 的同学. 游戏 ...
- 【luoguP1196】 [NOI2002]银河英雄传说--边带权并查集 ,
题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...
- 洛谷 1196 [NOI2002]银河英雄传说【模板】带权并查集
[题解] 经典的带权并查集题目. 设cnt[i]表示i前面的点的数量,siz[i]表示第i个点(这个点是代表元)所处的联通块的大小:合并的时候更新siz.旧的代表元的cnt,路径压缩的时候维护cnt即 ...
- AcWing 238.银河英雄传说 (边带权并查集)
题意:有\(n\)列,有\(T\)条指令,若指令格式为\(M\),则将第\(i\)号的所有战舰移到第\(j\)号所在列的后面,若指令格式为\(C\),询问\(i\)和\(j\)是否在同一列,如果在,问 ...
- 洛谷——P1196 [NOI2002]银河英雄传说
P1196 [NOI2002]银河英雄传说 题目大意: 给你一个序列,支持两种操作: 合并指令为$M_{i,j}$j,含义为第i号战舰所在的整个战舰队列,作为一个整体(头在前尾在后)接至第j号战舰所 ...
- 洛谷 P1196 【银河英雄传说】
这道题其实就是一个带权并查集的基础题,维护的是点权,所以我们要维护两个数组dis:表示当前点到父亲节点的距离,size:当前子树的大小.那么程序就自然出来了: 代码: #include <bit ...
随机推荐
- 【LeetCode】368. Largest Divisible Subset 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/largest-d ...
- 【剑指Offer】数组中重复的数字 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 Set 快慢指针 日期 题目地址:https://leetcod ...
- D. Chloe and pleasant prizes
D. Chloe and pleasant prizes time limit per test 2 seconds memory limit per test 256 megabytes input ...
- Optimal Symmetric Paths(UVA12295)
Description You have a grid of n rows and n columns. Each of the unit squares contains a non-zero ...
- 1164 - Horrible Queries
1164 - Horrible Queries PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 64 M ...
- Trial-faster-rcnn
目录 motivation 实验设置 实验结果 motivation 试一下faster rcnn的代码, 主要想看看backbone训练一部分好呢还是全部都训练好呢? 实验设置 Attribute ...
- Nginx部署及Web基础
目录 Nginx部署及Web基础 Nginx简介 Nginx特点 Web服务 Web服务器软件 Nginx和Apache对比图 部署Nginx yum安装 编译安装 平滑增加Nginx模块 Nginx ...
- JAVA获取上下行网速
JAVA获取上下行网速 package com.iecas.zwterminalstate.util;import java.io.BufferedReader;import java.io.IOEx ...
- .net core在linux下图片中文乱码
不得不吐槽一下,.net core 2.2的System.Drawing在linux有很多坑,又是依赖libgdiplus,又是依赖gdiplus,依赖解决了又来了个中文乱码,怎的一声哀叹 这里做个笔 ...
- 图像数据到网格数据-1——Marching Cubes算法的一种实现
概述 之前的博文已经完整的介绍了三维图像数据和三角形网格数据.在实际应用中,利用遥感硬件或者各种探测仪器,可以获得表征现实世界中物体的三维图像.比如利用CT机扫描人体得到人体断层扫描图像,就是一个表征 ...