并查集的基础题
## 洛谷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的网络, 使得前者局域网中的机器能够安全访…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
