并查集的基础题
## 洛谷p1196 绿 35m
点到祖先的距离
代码:
```
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
int f[N],dist[N],num[N];//num计算祖先有多少儿子 ,dist计算距离祖先有几个
int zx(int x){
if(f[x]==x)return x;//x没爸爸
else{
int k=f[x];
f[x]=zx(f[x]);
dist[x]+=dist[k];
num[x]=num[f[x]];
return f[x];
}
}
void h(int x,int y){
int r1=zx(x),r2=zx(y);
f[r1]=r2;
dist[r1]=dist[r2]+num[r2];
num[r2]+=num[r1];
num[r1]=num[r2];
}
int main(){
int n;cin>>n;
for(int i=1;i<=N;i++){
f[i]=i;
num[i]=1;
}
for(int i=1;i<=n;i++){
char x;cin>>x;
int a,b;cin>>a>>b;
if(x=='M'){
if(zx(a)!=zx(b)){
h(a,b);
}
}
else{
if(zx(a)==zx(b)){
cout<<abs(dist[a]-dist[b])-1<<endl;
}
else cout<<"-1"<<endl;
}
}
}
```
## 洛谷p1525 绿 30m
种类并查集(2种)
代码:
```
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int f[N];
struct A{
int x,y,val;
}a[N];
ll b[N];
bool cmp(A q,A w){
return q.val>w.val;
}
int zx(int x){
if(f[x]==x)return x;//x没爸爸
else return f[x]=zx(f[x]);//找出爸爸的爸爸的。。
}
void h(int x,int y){
f[zx(y)]=zx(x);//x的最大祖先变成y最大祖先的爸爸;
}
int main(){
ll n,m;cin>>n>>m;
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++){
cin>>a[i].x>>a[i].y>>a[i].val;
}
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m+1;i++){
if(zx(a[i].x)==zx(a[i].y)){
cout<<a[i].val<<endl;
break;
}
else{
if(!b[a[i].x])b[a[i].x]=a[i].y;
else h(b[a[i].x],a[i].y);//与敌人的敌人合并
if(!b[a[i].y])b[a[i].y]=a[i].x;
else h(a[i].x,b[a[i].y]);
}
}
}
```
## 洛谷p2024 绿 35m
种类并查集(3种)
代码:
```
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int f[N];ll n,m;
ll ans=0;
int zx(int x){
if(f[x]==x)return x;//x没爸爸
else return f[x]=zx(f[x]);//找出爸爸的爸爸的。。
}
void h(int x,int y){
f[zx(y)]=zx(x);//x的最大祖先变成y最大祖先的爸爸;
f[zx(y+n)]=zx(x+n);
f[zx(y+n+n)]=zx(x+n+n);
}
void h1(int x,int y){
f[zx(y+n)]=zx(x);//x的最大祖先变成y最大祖先的爸爸;
f[zx(y+n+n)]=zx(x+n);
f[zx(y)]=zx(x+n+n);
}
int main(){
cin>>n>>m;
for(int i=1;i<=3*n;i++)f[i]=i;
while(m--){
int op,x,y;cin>>op>>x>>y;
if(x>n||y>n){
ans++;continue;
}
if(op==1){
if(zx(x+n)==zx(y)||zx(y+n)==zx(x))ans++;//y吃x,x吃y else{
else{
h(x,y);
}
}
else{
if(zx(x)==zx(y)||zx(y)==zx(x+n))ans++;//如果x和y是同类,y吃x
else{
h1(x,y);
}
}
}
cout<<ans<<endl;
}
## 洛谷p1197 绿 1h
先合并后摧毁
代码:
```
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+10;
struct A{
int x,y,id;
}a[N];
ll n,m;
int f[N],num=0,ans[N],vis[N];
int zx(int x){
if(f[x]==x)return x;//x没爸爸
else return f[x]=zx(f[x]);//找出爸爸的爸爸的。。
}
void h(int x,int y){
if(zx(y)!=zx(x))num--;
f[zx(y)]=zx(x);//x的最大祖先变成y最大祖先的爸爸;
}
bool cmp(A q,A w){
return q.id<w.id;
}
int main(){
cin>>n>>m;num=n;
for(int i=0;i<n;i++)f[i]=i;
for(int i=1;i<=m;i++){
cin>>a[i].x>>a[i].y;
a[i].id=0;
}
int k;cin>>k;
for(int i=1;i<=k;i++){
int z;cin>>z;
vis[z]=k-i+1;//给下面k个数字逆着给个下标
}
for(int i=1;i<=m;i++){
a[i].id=max(vis[a[i].x],vis[a[i].y]);
}
sort(a+1,a+m+1,cmp);
int j=1;
for(int i=0,j=1;i<=k;i++){//枚举被攻占的星球序号
while(j<=m&&a[j].id==i){
h(a[j].x,a[j].y);
j++;
}
ans[i]=num-(k-i);
}
for(int i=k;i>=0;i--)cout<<ans[i]<<endl;
return 0;
}
```
## 洛谷p1640 蓝 1h
题意:lxh有n个武器,每个武器有两种属性,每个武器最多只能使用一次,要从属性1开始连续递增攻击,最多能连续攻击几次?
分析:问题当中要从小到大使用所有属性,所以肯定要有以1…10000属性为点的一侧。把装备放在另一侧,装备和它的两个属性连边.(也就相当于从左到右一连,再从右到左一连,才相当于用了两个属性。从小到大匹配属性点,因为题目要求必须要每个技能依次释放,所以要有else break环节,这是一个网络流二分图中需要重点注意的环节,有时要加而有时不要,这里要加上还是比较好理解的。
代码:
```
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
vector<int>v[N];
int f[N],t=0,vis[N],l[N];
int zx(int x){
for(int i=0;i<v[x].size();i++){
int p=v[x][i];//x的序列们
if(vis[p]!=t){//如果上次访问的时间不是当前时间
vis[p]=t;//更新为当前时间
if(l[p]==0||zx(l[p])){//如果x没有匹配或有路径
l[p]=x;//p与x匹配
return 1;
}
}
}
return 0;
}
int main(){
ll n,a,b;cin>>n;
for(int i=1;i<=n;i++){
cin>>a>>b;
v[a].push_back(i);//将序列存入属性里
v[b].push_back(i);
}
int ans=0;
for(int i=1;i<=n;i++){
t++;
if(zx(i))ans++;//如果存在就加
else break;//不存在就结束 必须是连续的
}
cout<<ans<<endl;
return 0;
}
```
## 洛谷p1892 绿 10m
题意:朋友的朋友是朋友,敌人的敌人是朋友,求最多团体数。
分析:种类并查集(2种)
代码:
```
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int f[N];
struct A{
int x,y;
}a[N];
ll b[N];
int zx(int x){
if(f[x]==x)return x;//x没爸爸
else return f[x]=zx(f[x]);//找出爸爸的爸爸的。。
}
void h(int x,int y){
f[zx(y)]=zx(x);//x的最大祖先变成y最大祖先的爸爸;
}
int main(){
ll n,m;cin>>n>>m;
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++){
char op;cin>>op;
cin>>a[i].x>>a[i].y;
if(op=='E'){
if(!b[a[i].x])b[a[i].x]=a[i].y;
else h(b[a[i].x],a[i].y);//与敌人的敌人合并
if(!b[a[i].y])b[a[i].y]=a[i].x;
else h(a[i].x,b[a[i].y]);
}
else{
h(a[i].x,a[i].y);
}
}
map<int,int>mp;
int ans=0;
for(int i=1;i<=n;i++){
mp[zx(i)]++;
if(mp[zx(i)]==1)ans++;
}
cout<<ans<<endl;
}
```
## 洛谷p1621 绿 2h
题意:给了a到b范围内的整数,每次选择两个合并,这个两个拥有大于等于p的公共质因数,求最后有多少个集合
代码:
```
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long ll;
vector<int> prime;
bool is_prime[N];
int f[N];int a,b,p,v[N];
int zx(int x){
if(f[x]==x)return x;//x没爸爸
else return f[x]=zx(f[x]);//找出爸爸的爸爸的。。
}
void h(int x,int y){
f[zx(y)]=zx(x);//x的最大祖先变成y最大祖先的爸爸;
}
void Eratosthenes(int n) {
is_prime[0] = is_prime[1] = false;
for (int i = 2; i <= n; ++i) is_prime[i] = true;
// i * i <= n 说明 i <= sqrt(n)
for (int i = 2; i * i <= n; ++i) {
if (is_prime[i])
for (int j = i * i; j <= n; j += i) is_prime[j] = false;
}
for (int i = 2; i <= n; ++i)
if (is_prime[i]&&i>=p) prime.push_back(i);
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>a>>b>>p;
for(int i=1;i<=b;i++)f[i]=i;
Eratosthenes(b);
int cnt=1;
for(int i=p;i<=b;i++){
if(is_prime[i]){
v[cnt]=i;
cnt++;
}
}
for(int i=1;i<cnt;i++){
int c=0;
while(c*v[i]<a)c++;
while(v[i]*(c+1)<=b){
h(v[i]*c,v[i]*(c+1));
c++;
}
}
ll ans=0;
for(int i=a;i<=b;i++){
if(f[i]==i)ans++;
}
cout<<ans<<endl;
return 0;
}
```
相关文章:
并查集的基础题
## 洛谷p1196 绿 35m 点到祖先的距离 代码: #include<bits/stdc.h> using namespace std; const int N3e510; int f[N],dist[N],num[N];//num计算祖先有多少儿子 ,dist计算距离祖先有几个 int zx(int x){ if(f[x]x)return x;//x没爸爸 e…...
[论文翻译] LTAChecker:利用注意力时态网络基于 Dalvik 操作码序列的轻量级安卓恶意软件检测
LTAChecker: Lightweight Android Malware Detection Based on Dalvik Opcode Sequences using Attention Temporal Networks 摘要: Android 应用程序已成为黑客攻击的主要目标。安卓恶意软件检测是一项关键技术,对保障网络安全和阻止异常情况至关重要。…...
HTTPS链接建立的过程
HTTPS(HyperText Transfer Protocol Secure)建立链接的过程主要是通过TLS(Transport Layer Security)协议来实现的。HTTPS的链接建立过程可以分为以下几个步骤: 1. **客户端发起请求** - 客户端向服务器发送一个请求&…...
文档控件DevExpress Office File API v24.1 - 支持基于Unix系统的打印
DevExpress Office File API是一个专为C#, VB.NET 和 ASP.NET等开发人员提供的非可视化.NET库。有了这个库,不用安装Microsoft Office,就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…...
IP地址封装类(InetAddress类)
文章目录 前言一、IP地址是什么?二、IP地址封装类 1.常用方法2.实操展示总结 前言 当我们想要获取到通信对方的IP地址、主机地址等信息时,我们可以使用InetAddress类。InetAddress类在java的net包中。 一、IP地址是什么? IP地址 (Internet Pr…...
数据库设计规范化
在数据库设计中,尤其是在关系型数据库管理系统中,规范化(Normalization)是一种通过减少数据冗余和依赖关系来优化数据库表结构的过程。规范化可以确保数据的完整性和减少数据更新时的问题。规范化的过程通常遵循一系列标准或范式&…...
预约咨询小程序搭建教程,源码获取,从0到1完成开发并部署上线
目录 一、明确需求与规划功能 二、选择开发工具与模板 三、编辑小程序内容 四、发布与运营 五、部分代码展示 制作一个预约咨询小程序,主要可以分为以下几个步骤: 一、明确需求与规划功能 明确需求: 1.确定小程序的服务对象…...
leetcode217. 存在重复元素,哈希表秒解
leetcode217. 存在重复元素 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。 示例 1: 输入:nums [1,2,3,1] 输出:true 示例 2&#x…...
QT:QString 支持 UTF-8 编码吗?
在 Qt 中,字符串的处理主要依赖于 QString 类。QString 内部并不是直接使用 UTF-8 编码来存储数据的。相反,QString 使用 Unicode(特别是 UTF-16)来存储文本,以支持多语言环境的国际化应用。这种设计使得 QString 能够…...
我主编的电子技术实验手册(13)——电磁元件之继电器
本专栏是笔者主编教材(图0所示)的电子版,依托简易的元器件和仪表安排了30多个实验,主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】,精心设计的【实验步骤】,全面丰富的【思考习…...
odoo from样式更新
.xodoo_form {.o_form_sheet {padding-bottom: 0 !important;border-style: solid !important;border-color: white;}.o_inner_group {/* 线框的样式 *//*--line-box-border: 1px solid #666;*//*box-shadow: 0 1px 0 #e6e6e6;*/margin: 0;}.grid {display: grid;gap: 0;}.row …...
Oracle(52)分区表有哪些类型?
分区表在Oracle数据库中主要分为以下几种类型: 范围分区(Range Partitioning)列表分区(List Partitioning)哈希分区(Hash Partitioning)组合分区(Composite Partitioning࿰…...
大黄蜂能飞的起来吗?
Bumblebee argument 虽然早期的空气动力学证明大黄蜂不能飞行——因为体重太重,翅膀太薄,但大黄蜂并不知道,所以照飞不误。 背景 在20世纪初,科学家们通过研究发现,大黄蜂的身体与翼展的比例失调,按照…...
虹科新品 | PDF记录仪新增蓝牙®接口型号HK-LIBERO CL-Y
新品发布!HK-LIBERO CE / CH / CL产品家族新增蓝牙接口型号HK-LIBERO CL-Y! PDF记录仪系列新增蓝牙接口型号 HK-LIBERO CL-Y HK-LIBERO CE、HK-LIBERO CH和HK-LIBERO CL,虹科ELPRO提供了一系列高品质的蓝牙(BLE)多用途…...
Bytebase 2.22.1 - SQL 编辑器展示更丰富的 Schema 信息
🚀 新功能 SQL 编辑器直接展示表,视图,函数,存储过程等各种 Schema 详情。OpenAI 功能进入社区版(免费),现在您可以通过配置自有 OpenAI key 在 SQL 编辑器中启用自然语言转 SQL 功能。支持在 …...
SQL Server Management Studio的使用
之前在 https://blog.csdn.net/fengbingchun/article/details/140961550 介绍了在Windows10上安装SQL Server 2022 Express和SSMS,这里整理下SSMS的简单使用: SQL Server Management Studio(SSMS)是一种集成环境,提供用于配置、监视和管理SQL…...
Python 爬虫项目实战一:抖音视频下载与网易云音乐下载
一、项目背景 随着互联网的发展,爬虫技术在数据采集和资源获取中发挥着重要作用。本文将以实际案例为例,使用Python语言实现两个热门的爬虫项目:抖音视频文件下载和网易云音乐下载。通过这些实例,读者可以了解如何利用Python编写…...
CAMDS=中国汽车MDS
1、定义和缩写 MSDS(材料安全数据表, Material Safety Data Sheets),德语为SDB(Sicherheitsdatenbltter),是一种传达材料和混合物安全相关信息的工具,包括来自供应链和下游用户相关材料安全报告的信息。它们旨在为专业用户提供使用这些物质和制剂的必要信息和处理建议,…...
【Golang 面试 - 进阶题】每日 3 题(十七)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...
ROS 7上实现私网互通方案
一、背景: 第一个私网现状:连接公域网是由tp-link进行拨号链接使用动态公网ip,内部网段是192.168.1.0/24 第二个私网现状:连接公域网是机房的固定公网ip,内部网段为10.0.0.0/16二、目标 安全的打通192.168.1.0/24和10.0.0.0/16的网络, 使得前者局域网中的机器能够安全访…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
