【Acwing并查集】238. 银河英雄传说

article/2025/10/21 17:57:09

238. 银河英雄传说 - AcWing题库

题意:

思路:

并查集维护两个信息:每个连通块的size和每个结点之间的距离

对于连通块的size,只需要在合并的时候维护一下就好了

对于每个结点之间的距离,我们考虑类似于树上差分的思想,先处理每个结点离根节点的距离,再差分减一下就好了

那么问题就转化成维护每个结点离根节点的距离

由于维护的信息的主体是结点,那么就不能只在合并的时候维护了,在find的时候也需要维护

我们将连通块v接到连通块u下面时,更新连通块v的每个结点离根节点的距离,因为根节点换了,同时也要更新连通块的size

更新连通块v每个结点的信息是通过find回溯的时候更新的,我们给u的原先的根节点+=size(u)就行,这样在之后如果访问连通块v的某个结点时,find在回溯时会把这个结点和连通块v原先根节点之间的所有结点都更新,同时也将这些结点路径压缩,这有点像线段树懒标记的感觉

路径压缩后,虽然原先的链式结构被破坏,但是距离信息保留在d数组中,因此查询的时候直接查询d[x]就好了,d数组相当于是前缀和数组

如果之后又要合并已经被路径压缩的结点,也是同样的道理,先更新连通块根节点(相当于打个标记),然后在查询的时候回溯下传求前缀和就好了

Code:

#include <bits/stdc++.h>
using namespace std;
const int mxn=3e4+10;
string op;
int n,x,y;
int f[mxn],sz[mxn],d[mxn];
int find(int x){if(f[x]!=x){int rt=find(f[x]);d[x]+=d[f[x]];f[x]=rt;}return f[x];
}
void join(int u,int v){int f1=find(u),f2=find(v);if(f1!=f2){f[f1]=f2;d[f1]=sz[f2];sz[f2]+=sz[f1];}
}
int main(){ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin>>n;for(int i=1;i<mxn;i++) f[i]=i,sz[i]=1;for(int i=1;i<=n;i++){cin>>op>>x>>y;if(op=="M"){join(x,y);}else{int a=find(x),b=find(y);if(a!=b) cout<<-1<<'\n';else cout<<max(0,abs(d[x]-d[y])-1)<<'\n';}}
}

总结:

当要我们维护联通块信息、涉及到分类、判环、维护传递性关系时都可以用并查集

在写并查集之前先考虑好并查集维护的对象

并查集维护两种信息:连通块信息和结点信息

维护连通块信息时,只需在合并的时候维护就好了,维护完连通块之后可以考虑缩点

维护结点信息时,要在find和merge时一起维护,在merge的时候给根节点打标记,在find的时候回溯下传标记


http://chatgpt.dhexx.cn/article/Aj3NrE11.shtml

相关文章

二次元《尤里国简介》

《红色警戒2&#xff1a;尤里的复仇 》中的国家 尤里国&#xff08;The Country Of Yuri&#xff09;&#xff0c;其他名称&#xff1a;Yuri Country&#xff1b;Mind federal&#xff1b;ThirdSide。 尤里国&#xff0c;是EA公司的westwood工作室制作的即时战略游戏《红色警…

封神台靶场-尤里的复仇-第二章

1&#xff0c;随便选择一则新闻&#xff0c;同样判断是否存在SQL注入发现存在and update delete ; insert mid master限制 and update delete ; insert mid master 等非法字符&#xff01; http://kypt8004.ia.aqlab.cn/shownews.asp?id171 order by 2可以先判断字段数&#x…

初音同人游戏 ミクっぽいどは俺の嫁 汉化补丁+攻略

游戏名称: ミクっぽいどは俺の嫁 游戏类型&#xff1a;同人 游戏本体和介绍 请自己 Baidu一下 汉化 部分: True END 完全汉化 之所以 不得不停止 汉化BE 因为 那个Flash加密我还不能够完全 解决 其实 也算我个人不喜欢BE 吧 大师♂罗莊 汉化 翻译感谢 椰子 攻略&#xff0…

チルリル / 阴剑

目录 基本资料面板值&#xff08;无天冥加成&#xff09;天冥奖励 战斗宣言&#xff08;VC&#xff09;技能本体AS 珠子 回到人物索引 基本资料 NS(4★)NS(5★)AS卡池 (Ver 2.5.0)卡池 (Ver 2.5.0)卡池 (Ver 2.8.0)—アビスデボーテの書&#xff08;ナダラ火山VH古代ゼルベリ…

銀織の雷使い(プレメア) / 银雷(异时层机娘)

目录 基本资料面板值&#xff08;无天冥加成&#xff09;天冥奖励 战斗宣言&#xff08;VC&#xff09;被动效果Another Sense技能珠子 回到人物索引 基本资料 NS(5★)卡池 (Ver 2.11.70)レシェフの典録 天冥属性武器防具属性耐性异常耐性NS冥雷&水弓戒指雷30%10%个性弓…

花咲の姫君(異時層ツキハ) / 花咲(异时层妖刀)

目录 基本资料面板值&#xff08;无天冥加成&#xff09;天冥奖励 战斗宣言&#xff08;VC&#xff09;被动效果Another Sense技能珠子 回到人物索引 基本资料 NS(5★)卡池 (Ver 2.13.50)ミヤビノカミの典録 天冥属性武器防具属性耐性异常耐性NS天火枪护腕风30%10%个性枪、东…

C语言——指针

目录 指针是什么&#xff1f; 指针变量 ​ 使用指针变量的例子 通过指针引用数组 &数组名vs数组名 野指针 野指针成因 如何避免野指针 指针运算 指针是什么&#xff1f; 指针是c语言中的一个重要概念&#xff0c;也是C语言的一个重要的特色&#xff0c;正确而灵活地运用…

指向指针的指针

C指向指针的指针 指向指针的指针是一种多级间接寻址的形式&#xff0c;或者说是一个指针链。通常&#xff0c;一个指针包含一个变量的地址。当我们定义一个指向指针的指针时&#xff0c;第一个指针包含了第二个指针的地址&#xff0c;第二个指针指向包含实际值的位置。 一个指…

双指针详解

1、定义 顾名思义&#xff0c;双指针即用两个不同速度或不同方向的指针对数组或对象进行访问&#xff0c;通过两个不同指针的碰撞从而达到特定的目的。 2、解决问题 在时间或空间条件有限的情况下使用单向遍历需要消耗大量的时间或者根本无法解决问题&#xff0c;这时候就需…

指针基本认识

指针 一、指针是什么&#xff1f;二、指针和指针类型1.指针-整数2.指针的解引用 三、野指针四、指针运算1.指针-指针2.指针关系运算 五、指针和数组六、二级指针七、指针数组 一、指针是什么&#xff1f; 在计算机科学中&#xff0c;指针&#xff08;Pointer&#xff09;是编程…

c++ 指针详解

文章目录 指针1、 使用指针遍历[数组](https://blog.csdn.net/m0_62870588/article/details/123787052)2、指针的概念与理解3、指针的创建与初始化4、指针的基本操作5、指针的算数操作6、[const](https://blog.csdn.net/m0_62870588/article/details/123399735)指针7、指针的[数…

深入理解C语言指针

一、指针的概念 要知道指针的概念&#xff0c;要先了解变量在内存中如何存储的。在存储时&#xff0c;内存被分为一块一块的。每一块都有一个特有的编号。而这个编号可以暂时理解为指针&#xff0c;就像酒店的门牌号一样。 1.1、变量和地址 先写一段简单的代码&#xff1a; …

c语言指针的指针

1、情况 c语言指针的指针&#xff0c;还是比较常用的一个功能&#xff1b;当然&#xff0c;我也相信&#xff0c;一些用C语言很长时间的人&#xff0c;也没大用过&#xff0c;因为用不到&#xff0c;这是工作需求决定的&#xff0c;但总体来说&#xff0c;还是经常用的。 理解…

十四、C指针详解(四):指针的指针

文章目录 一、指针的指针 一、指针的指针 指针用来存放变量的地址&#xff0c;同时&#xff0c;指针也有自己的地址&#xff0c;因此&#xff0c;就可以设置一个指针变量&#xff0c;用来存放指针的地址&#xff0c;也就是指针的指针&#xff0c;他存放的是一个地址&#xff0…

指针的指针、字符串和指针、数组指针(详)

一、指针的指针 指针的指针&#xff0c;即指针的地址 定义了一个指针变量&#xff0c;指针变量本身占4个字节&#xff0c;指针变量也有地址编号 例&#xff1a; int a0x12345678; 假设a的地址为&#xff1a;0x0000 2000 int *p; p&a; 则p中存放的是a的地址编号为0x0000 20…

指针的指针(简单易懂)

int a 12&#xff1b; int *b &a; 内存的分配如下 这时再来一个变量 c &b; 问题来了? c 是什么类型? b 是指向整型的指针 ,c 是指向整形指针的指针&#xff1f; 是的 c 是指向指针的指针 声明如下 int ** c; int a 12; int *b &a; int **c &b…

Nginx Rewrite规则详解

Nginx Rewrite 规则相关指令 相关指令有if,rewrite,set,return,break等&#xff0c;其中最关键的就是rewrite.一个简单的Nginx Rewrite规则语法如下&#xff1a;rewrite ^/b/(.*)\.html /play.php?video$1 break; 1.break指令 默认值&#xff1a;none ;使用环境&#xff1a…

nginx配置文件rewrite规则

nginx配置文件rewrite规则 文章目录 nginx配置文件rewrite规则[toc]ifRewite 规则介绍flag标志位配置rewrite规则last二次转发 if 语法&#xff1a;if (condition) {…} 应用场景&#xff1a; server段 location段 常见的condition 变量名&#xff08;变量值为空串&#xf…

nginx Rewrite 规则

一&#xff1a;nginx Rewrite 规则 1&#xff1a;rewrite的概念&#xff1a; Nginx Rewrite功能是使用nginx提供的全局变量或自己设置的变量&#xff0c;结合正则表达式和标志位实现URL重写以及重定向功能。Rewrite指令只能放在server {}&#xff0c;location {}&#xff0c;…

Nginx高级之Rewrite规则

进阶阶段的回顾: Nginx进阶之静态Web资源服务 Nginx进阶之代理服务 Nginx进阶之负载均衡服务 Nginx进阶之缓存服务和动静分离 作用及应用场景 作用: 实现对URL的重写以及对匹配(正则表达式)的url的重定向 场景: 1. URL访问跳转, 支持开发设计 ① 页面跳转 ② 兼容…