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

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...