当前位置: 首页 > news >正文

并查集的基础题

## 洛谷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 点到祖先的距离 代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N3e510; int f[N],dist[N],num[N];//num计算祖先有多少儿子 &#xff0c;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 摘要&#xff1a; Android 应用程序已成为黑客攻击的主要目标。安卓恶意软件检测是一项关键技术&#xff0c;对保障网络安全和阻止异常情况至关重要。…...

HTTPS链接建立的过程

HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;建立链接的过程主要是通过TLS&#xff08;Transport Layer Security&#xff09;协议来实现的。HTTPS的链接建立过程可以分为以下几个步骤&#xff1a; 1. **客户端发起请求** - 客户端向服务器发送一个请求&…...

文档控件DevExpress Office File API v24.1 - 支持基于Unix系统的打印

DevExpress Office File API是一个专为C#, VB.NET 和 ASP.NET等开发人员提供的非可视化.NET库。有了这个库&#xff0c;不用安装Microsoft Office&#xff0c;就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…...

IP地址封装类(InetAddress类)

文章目录 前言一、IP地址是什么&#xff1f;二、IP地址封装类 1.常用方法2.实操展示总结 前言 当我们想要获取到通信对方的IP地址、主机地址等信息时&#xff0c;我们可以使用InetAddress类。InetAddress类在java的net包中。 一、IP地址是什么&#xff1f; IP地址 (Internet Pr…...

数据库设计规范化

在数据库设计中&#xff0c;尤其是在关系型数据库管理系统中&#xff0c;规范化&#xff08;Normalization&#xff09;是一种通过减少数据冗余和依赖关系来优化数据库表结构的过程。规范化可以确保数据的完整性和减少数据更新时的问题。规范化的过程通常遵循一系列标准或范式&…...

预约咨询小程序搭建教程,源码获取,从0到1完成开发并部署上线

目录 一、明确需求与规划功能 二、选择开发工具与模板 三、编辑小程序内容 四、发布与运营 五、部分代码展示 制作一个预约咨询小程序&#xff0c;主要可以分为以下几个步骤&#xff1a; 一、明确需求与规划功能 明确需求&#xff1a; 1.确定小程序的服务对象&#xf…...

leetcode217. 存在重复元素,哈希表秒解

leetcode217. 存在重复元素 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,1] 输出&#xff1a;true 示例 2&#x…...

QT:QString 支持 UTF-8 编码吗?

在 Qt 中&#xff0c;字符串的处理主要依赖于 QString 类。QString 内部并不是直接使用 UTF-8 编码来存储数据的。相反&#xff0c;QString 使用 Unicode&#xff08;特别是 UTF-16&#xff09;来存储文本&#xff0c;以支持多语言环境的国际化应用。这种设计使得 QString 能够…...

我主编的电子技术实验手册(13)——电磁元件之继电器

本专栏是笔者主编教材&#xff08;图0所示&#xff09;的电子版&#xff0c;依托简易的元器件和仪表安排了30多个实验&#xff0c;主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】&#xff0c;精心设计的【实验步骤】&#xff0c;全面丰富的【思考习…...

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数据库中主要分为以下几种类型&#xff1a; 范围分区&#xff08;Range Partitioning&#xff09;列表分区&#xff08;List Partitioning&#xff09;哈希分区&#xff08;Hash Partitioning&#xff09;组合分区&#xff08;Composite Partitioning&#xff0…...

大黄蜂能飞的起来吗?

Bumblebee argument 虽然早期的空气动力学证明大黄蜂不能飞行——因为体重太重&#xff0c;翅膀太薄&#xff0c;但大黄蜂并不知道&#xff0c;所以照飞不误。 背景 在20世纪初&#xff0c;‌科学家们通过研究发现&#xff0c;‌大黄蜂的身体与翼展的比例失调&#xff0c;‌按照…...

虹科新品 | PDF记录仪新增蓝牙®接口型号HK-LIBERO CL-Y

新品发布&#xff01;HK-LIBERO CE / CH / CL产品家族新增蓝牙接口型号HK-LIBERO CL-Y&#xff01; PDF记录仪系列新增蓝牙接口型号 HK-LIBERO CL-Y HK-LIBERO CE、HK-LIBERO CH和HK-LIBERO CL&#xff0c;虹科ELPRO提供了一系列高品质的蓝牙&#xff08;BLE&#xff09;多用途…...

Bytebase 2.22.1 - SQL 编辑器展示更丰富的 Schema 信息

&#x1f680; 新功能 SQL 编辑器直接展示表&#xff0c;视图&#xff0c;函数&#xff0c;存储过程等各种 Schema 详情。OpenAI 功能进入社区版&#xff08;免费&#xff09;&#xff0c;现在您可以通过配置自有 OpenAI key 在 SQL 编辑器中启用自然语言转 SQL 功能。支持在 …...

SQL Server Management Studio的使用

之前在 https://blog.csdn.net/fengbingchun/article/details/140961550 介绍了在Windows10上安装SQL Server 2022 Express和SSMS&#xff0c;这里整理下SSMS的简单使用&#xff1a; SQL Server Management Studio(SSMS)是一种集成环境&#xff0c;提供用于配置、监视和管理SQL…...

Python 爬虫项目实战一:抖音视频下载与网易云音乐下载

一、项目背景 随着互联网的发展&#xff0c;爬虫技术在数据采集和资源获取中发挥着重要作用。本文将以实际案例为例&#xff0c;使用Python语言实现两个热门的爬虫项目&#xff1a;抖音视频文件下载和网易云音乐下载。通过这些实例&#xff0c;读者可以了解如何利用Python编写…...

CAMDS=中国汽车MDS

1、定义和缩写 MSDS(材料安全数据表, Material Safety Data Sheets),德语为SDB(Sicherheitsdatenbltter),是一种传达材料和混合物安全相关信息的工具,包括来自供应链和下游用户相关材料安全报告的信息。它们旨在为专业用户提供使用这些物质和制剂的必要信息和处理建议,…...

【Golang 面试 - 进阶题】每日 3 题(十七)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…...

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的网络, 使得前者局域网中的机器能够安全访…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...