备战蓝桥杯之并查集刷题之删除

news/发布时间2024/5/15 23:55:26

题目比较模板,但是也扩展了许多以前不知道的知识点,记录一下比较有启发性的题。

目录

1.并查集之删除操作---创点转移:

2.并查集之删除操作---逆向思考:


1.并查集之删除操作---创点转移:

1和3都是并查集的基础操作,这里就不说了(以前讲过),我们主要看2,我们把2的操作拆分成先去除p,再合并p,那么我们如何删除呢?

我们可以真的去删,但是我们需要修改子节点的连接,会增加时间复杂度并且比较麻烦。

于是我们采用用空间换时间的策略,我们可以再创建一个点,当我们删3时,我们可以保留原来的位置,但是我们需要为3提供真实的点,于是我们用类似映射的方法real[3]=新创建的点,这样子,我们就把3的“空壳”留在原地方,而把3的“灵魂”存在了其他地方,这样其他的点也就不用操作了。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,p,q,c,fa[200010],real1[100005],cc;
struct node{int cnt;long long sum;
}root[200010];
int find(int x){if(fa[x]==x) return x;return fa[x]=find(fa[x]);
}
void merge(int x,int y){root[find(y)].cnt+=root[find(x)].cnt;root[find(y)].sum+=root[find(x)].sum;fa[find(x)]=find(y);
}
void del(int x){root[find(real1[x])].cnt--;root[find(real1[x])].sum-=x;real1[x]=++cc;root[cc].cnt=1;root[cc].sum=x;fa[cc]=cc;}
signed main(){while(cin>>n>>m){for(int i=1;i<=n;i++){fa[i]=i;real1[i]=i;root[i].cnt=1;root[i].sum=i;}cc=n;for(int i=1;i<=m;i++){cin>>c;if(c==1){cin>>p>>q;if(find(real1[p])==find(real1[q])) continue;merge(real1[p],real1[q]);}else if(c==2){cin>>p>>q;if(find(real1[p])==find(real1[q])) continue;del(p);merge(real1[p],real1[q]);}else{cin>>p;node ss=root[find(real1[p])];cout<<ss.cnt<<" "<<ss.sum<<endl;}}}
}

这里有几点需要注意:

1.多组输入注意对会新创建的值的改变,这里的cc每次都应从n开始。

2.注意合并时的判断条件必不可少,因为这里的并查集带了权值,重复时会导致值的重复相加。

2.并查集之删除操作---逆向思考:

以前有讲过,这里找到了个题目算是填坑了。我们先记录删的,把删的全删了,这样从反方向就是创建了。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,k,fa[400010],huei[400010],head[400010],cnt,ck[400010];
int hh[400010];
struct node{int dian,next;
}edge[400010];
void merge(int x,int y){edge[++cnt].dian=y;edge[cnt].next=head[x];head[x]=cnt;
}
int find(int x){if(fa[x]==x) return x;return fa[x]=find(fa[x]);
}
void merge1(int x,int y){fa[find(x)]=find(y);
}
int main(){cin>>n>>m;memset(head,-1,sizeof(head));for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);merge(x,y);merge(y,x);}cin>>k;for(int i=1;i<=k;i++){scanf("%d",&huei[i]);ck[huei[i]]=1;}for(int i=0;i<=n-1;i++) fa[i]=i;for(int i=0;i<=n-1;i++){if(ck[i]==1) continue;if(head[i]==-1) continue;for(int j=head[i];j!=-1;j=edge[j].next){if(ck[edge[j].dian]==1) continue;if(find(edge[j].dian)==find(i)) continue;merge1(edge[j].dian,i);}}int cc=0;for(int i=0;i<=n-1;i++){if(fa[i]==i&&ck[i]==0) cc++;}hh[k+1]=cc;for(int i=k;i>=1;i--){int gg=huei[i];ck[gg]=0;cc++;for(int j=head[gg];j!=-1;j=edge[j].next){if(ck[edge[j].dian]==1) continue;if(find(edge[j].dian)!=find(gg)) cc--;	merge1(edge[j].dian,gg);}hh[i]=cc;}for(int i=1;i<=k+1;i++){printf("%d\n",hh[i]);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/VYFd/4763.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

Spark 离线开发框架设计与实现

一、背景 随着 Spark 以及其社区的不断发展&#xff0c;Spark 本身技术也在不断成熟&#xff0c;Spark 在技术架构和性能上的优势越来越明显&#xff0c;目前大多数公司在大数据处理中都倾向使用 Spark。Spark 支持多种语言的开发&#xff0c;如 Scala、Java、Sql、Python 等。…

【深入了解设计模式】适配器设计模式

适配器设计模式 适配器设计模式是一种结构型设计模式&#xff0c;用于将一个类的接口转换成客户端所期望的另一个接口&#xff0c;从而使得原本由于接口不兼容而不能一起工作的类能够一起工作。适配器模式通常用于以下场景&#xff1a; 现有接口与需求不匹配&#xff1a;当需要…

PMP项目管理考试要注意些什么?

PMP考试和PMP备考过程中应该注意哪些问题&#xff1f; PMP备考完成后就要迎接实战考试了&#xff0c;考试前千万不要有多余的想法&#xff0c;顺其自然就行了&#xff0c;我想大家各种紧张、各种忧虑的原因大抵是因为考试成本考&#xff0c;担心考不过&#xff0c;其实只要你在…

基于IDEA+Mysql+Tomcat+Vue开发的框架的汇美食电子商城的设计与实现

基于IDEAMysqlTomcatVue开发的框架的汇美食电子商城的设计与实现 项目介绍&#x1f481;&#x1f3fb; 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于Vue框架的汇美食电子商城的设计与实现的开发全过程。通过分…

GPT+Python+GEE+ENVI高光谱,多光谱等成像遥感技术应用

原文链接&#xff1a;GPTPythonGEEENVI高光谱&#xff0c;多光谱等成像遥感技术应用https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247594986&idx2&sn770b456d434fdbada22e425b35affe08&chksmfa82320dcdf5bb1b9838b03e13381bdf38ea1b24ebc03526293756a…

python 基础知识点(蓝桥杯python科目个人复习计划51)

今日复习计划&#xff1a;做复习题 例题1&#xff1a;大石头的搬运工 问题描述&#xff1a; 在一款名为“大石头的搬运工”的游戏中&#xff0c;玩家需要 操作一排n堆石头&#xff0c;进行n - 1轮游戏。 每一轮&#xff0c;玩家可以选择一堆石头&#xff0c;并将其移动到任…

Js如何判断两个数组是否相等?

本文目录 1、通过数组自带方法比较2、通过循环判断3、toString()4、join()5、JSON.stringify() 日常开发&#xff0c;时不时会遇到需要判定2个数组是否相等的情况&#xff0c;需要实现考虑的场景有&#xff1a; 先判断长度&#xff0c;长度不等必然不等元素位置其他情况考虑 1…

OpenCvSharp Tracker 目标追踪

目录 效果 项目 代码 下载 C# OpenCvSharp Tracker 目标追踪 效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using OpenCvSharp.Tracking; using System; using System.Drawing; using System.Reflection; using System.Windows.Forms;namespace C__…

go环境安装-基于vscode的Windows安装

1、vscode安装 官网链接&#xff1a;https://code.visualstudio.com/ 选择相应的版本&#xff0c;这里选择Windows下的 下载得到一个VSCodeUserSetUp-x64的可执行文件&#xff0c;双击执行&#xff0c;选择要安装的路径&#xff0c;下一步。 2、go语言安装 官网链接&#x…

java面试(网络)

TCP和UDP有什么区别&#xff1f;TCP三次握手不是两次&#xff1f; TCP&#xff1a;面向连接&#xff0c;可靠的&#xff0c;传输层通信协议。点对点&#xff0c;占用资源多&#xff0c;效率低。 UDP&#xff1a;无连接&#xff0c;不可靠&#xff0c;传输层通信协议。广播&…

【杭州游戏业:创业热土,政策先行】

在前面的文章中&#xff0c;我们探讨了上海、北京、广州、深圳等城市的游戏产业现状。现在&#xff0c;我们切换视角&#xff0c;来看看另一个游戏创业热土——杭州的发展情况 最近第19届亚运会在杭州举办&#xff0c;本次亚运会上&#xff0c;电子竞技首次获准列为正式比赛项…

RAW 编程接口 TCP 简介

一、LWIP 中 中 RAW API 编程接口中与 TCP 相关的函数 二、LWIP TCP RAW API 函数 三、LwIP_Periodic_Handle函数 LwIP_Periodic_Handle 函数是一个必须被无限循环调用的 LwIP支持函数&#xff0c;一般在 main函数的无限循环中调用&#xff0c;主要功能是为 LwIP各个模块提供…

flink源码分析 - 获取调用位置信息

flink版本: flink-1.11.2 调用位置: org.apache.flink.streaming.api.datastream.DataStream#flatMap(org.apache.flink.api.common.functions.FlatMapFunction<T,R>) 代码核心位置: org.apache.flink.api.java.Utils#getCallLocationName() flink算子flatmap中调用了一…

如何让电脑待机而wifi不关的操作方法!!

1、一台电脑如果一天不关机&#xff0c;大约消耗0.3度电。 一般一台电脑的功耗约为250-400W&#xff08;台式机&#xff09;。 一台电脑每月的耗电量&#xff1a;如果是每小时300W每天10小时每月30天90KW&#xff0c;即90千瓦时的电。 这只是保守估计。 2、使用完毕后正常关闭…

ARM处理器有哪些工作模式和寄存器?各寄存器作用是什么?ARM异常中断处理流程?

《嵌入式工程师自我修养/C语言》系列——ARM处理器有哪些工作模式和寄存器&#xff1f;各寄存器作用是什么&#xff1f; 一、ARM处理器的工作模式及寄存器1.1 ARM处理器的工作模式1.2 ARM处理器中的寄存器 二、ARM 异常中断处理2.1 什么是异常&#xff1f;异常向量表是什么&…

Python爬虫进阶:爬取在线电视剧信息与高级检索

简介&#xff1a; 本文将向你展示如何使用Python创建一个能够爬取在线电视剧信息的爬虫&#xff0c;并介绍如何实现更高级的检索功能。我们将使用requests和BeautifulSoup库来爬取数据&#xff0c;并使用pandas库来处理和存储检索结果。 目录 一、爬取在线电视剧信息 …

es6 中的生成器 generator / 迭代器 / async /await 到底是个啥,使用场景

生成器 generator 到底是个啥 是一个函数 可以用来遍历数据结构是解决异步编程的一种方案进行数据流的生成和控制协程和状态机返回一个生成器对象/可迭代对象 生成器对象&#xff1a; 生成器对象是由生成器函数返回的对象&#xff0c;它符合迭代器协议&#xff08;Iterator Pr…

ChatGpt的初步认知(认知搬运工)

前言 ChatGpt火了有一段时间了&#xff0c;对各行各业也有了一定的渗透&#xff0c;当然发展过程中也做了一些安全约束&#xff0c;今天主要是来跟大家分享下关于chatGpt的初步认知。 一、chatGpt是什么&#xff1f; ChatGPT&#xff0c;全称聊天生成预训练转换器&#xff08;英…

K8S部署Java项目 pod的logs报错为:Error: Unable to access jarfile app.jar

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

react中使用echarts

先上一张效果图 React中 配置属性如下&#xff0c;可直接粘贴使用 import React, { useEffect, useMemo, useState } from react import * as echarts from echarts import ReactECharts from echarts-for-reactconst LineChart (props: any) > {const option {color: [#…
推荐文章