蓝桥杯上岸必背!!!(并查集补更)

news2024/11/16 9:21:20

蓝桥杯上岸必背!!!(并查集补更)

大家好 我是寸铁💪

冲刺蓝桥杯省一模板大全来啦 🔥

蓝桥杯4月8号就要开始了 🙏

距离蓝桥杯省赛倒数第3天 ❗️ ❗️ ❗️

还没背熟模板的伙伴们背起来 💪 💪 💪

真题千千万万遍,蓝桥省一自然现! ✌️

日更3000里,蓝桥眷顾你 🌟

暴力出奇迹,打表过样例 👊

祝大家4月8号蓝桥杯上岸 ☀️

不清楚蓝桥杯考什么的点点下方👇

考点秘籍

想背纯享模版的伙伴们点点下方👇

蓝桥杯省一你一定不能错过的模板大全(第一期)

蓝桥杯省一你一定不能错过的模板大全(第二期)

蓝桥杯省一你一定不能错过的模板大全(第三期)

蓝桥杯省一你一定不能错过的模板大全(第四期)!!!

想背注释模版的伙伴们点点下方👇

蓝桥杯必背第一期

蓝桥杯必背第二期

往期精彩回顾

蓝桥杯上岸每日N题 第一期(一)!!!

蓝桥杯上岸每日N题第一期(二)!!!

蓝桥杯上岸每日N题第一期(三)!!!

蓝桥杯上岸每日N题第二期(一)!!!

蓝桥杯上岸每日N题第三期(一)!!!

蓝桥杯上岸每日N题 第四期(最少刷题数)!!!

蓝桥杯上岸每日N题 第五期(山)!!!

蓝桥杯上岸每日N题 第六期(求阶乘)!!!

操作系统期末题库 第九期(完结)

LeetCode Hot100 刷题(第三期)

idea创建SpringBoot项目报错解决方案

数据库SQL语句(期末冲刺)

想看JavaB组填空题的伙伴们点点下方 👇

填空题

竞赛干货

算法竞赛字符串常用操作大全

蓝桥杯上岸必刷!!!(模拟/枚举专题)

蓝桥杯上岸必背!!! (第三期 DP)

蓝桥杯上岸必背!!!(第四期DFS)

蓝桥杯上岸必背!!!(第五期BFS)

蓝桥杯上岸必背!!!(第六期树与图的遍历)

蓝桥杯上岸必背!!!(第七期 最短路算法)

蓝桥杯上岸必背!!!(第八期 简单数论)


前言

喜欢的小伙伴可以关注我,关注寸铁,我们一起上岸4.8蓝桥杯!!!

并查集

合并集合

基本思想:
每个集合用一颗树来表示,树根的编号就是整个集合的编号。
每个节点存储它的父节点,p[x]表示x的父节点。
#三个问题
P1:如何判断树根
if(p[x]==x)即根节点和输入的集合编号(它本身)相等

P2:如何求x的集合编号
if(p[x]==x) return p[x];

P3:如何合并两个集合
p[x]是x的集合编号,p[y]是y的集合编号
那么,需要让p[x]接上y,即x的祖宗节点为y的一个子节点。

返回祖宗节点:

return p[x];
如果p[x]等于x的话,就返回p[x]即根节点x,此时的返回值为常量x。

路径压缩:

if(p[x]!=x)p[x]=find(p[x]);
代码解读:
如果p[x]不等于x的话,就进行路径压缩操作,即让每个p[x]与自身进行比较,很明显相等,返回的均是x,这样就实现了路径压缩。

分析过程图

在这里插入图片描述

#代码

import java.util.*;
public class Main{
    static int N=100010;
    static int p[]=new int[N];
    public static int find(int x){//返回祖宗节点+路径压缩
        //条件:节点的父节点p[x]为x(祖宗节点)
        //换句话来说,即只有祖宗节点等于它本身x
        if(p[x]!=x)p[x]=find(p[x]);//路径压缩
        
        return p[x];//返回祖宗节点
    }
   
    //等同于如下代码:
    public static int  find (int x){
        if(p[x]==x)return x;
        else{
            p[x]=find p[x];
        }
        return p[x];
    }
    
    public static void main(String []args){
        Scanner in = new Scanner(System.in);
        int n=in.nextInt();
        int m=in.nextInt();
        //初始化:即让当前数据的父节点指向其本身,将父节点设置为自己。
        for(int i=1;i<=n;i++)p[i]=i;
        while(m-->0){
            String s=in.next();
            int a=in.nextInt();
            int b=in.nextInt();
            //合并,将a的祖宗节点作为b的一个子节点插入
            if(s.equals("M"))p[find(a)]=find(b);
            else{//查找b和a的集合编号是否一致
                if(find(b)==find(a)){
                    System.out.println("Yes");
                }
                else{
                    System.out.println("No");
                }
            }
        }
    }
}

#参考资源
https://b23.tv/UDjPN9Y
https://b23.tv/13OXh8I

连通块中点的数量

思路

判断两节点是否在同一连通块中,就是看他们的祖宗节点是否相同。
合并操作使用并查集,将两个连通块合并成一个连通块。
还需要多维护一个size[]数组,用于统计节点所在连通块的数目
我们在求解某个点在连通块中的数量时,由于是连通块,一个点所在的块的点都会被包含在内,我们可以直接找到他的祖宗节点,用祖宗节点记录块中点的个数,再返回他的祖宗节点的个数即可。

注意

size[find(b)]+=size[find(a)];
p[find(a)]=find(b);
顺序是先加后合并,先合并后加可能会造成结果出错!
注:这里的ab顺序需要反着写
就比如size[]中是find(b)、find(a)
p[]中是find(a)find(b)
解释:我们在将a的祖宗节点指向b的祖宗节点时,是将a合并到b中。
所以,size数量时,应该是b的数量合并a的数量。
反之,也成立。
不清楚的同学可以看这篇题解:
https://www.acwing.com/activity/content/code/content/5333512/

ACcode

import java.util.*;
public class Main{
    static int N=100010;
    static int size[]=new int[N];
    static int p[]=new int[N];
    public static int find(int x){
        if(p[x]!=x)p[x]=find(p[x]);
        return p[x];
    }
    public static void main(String []args){
        Scanner in = new Scanner(System.in);
        int n=in.nextInt();
        int m=in.nextInt();
        for(int i=1;i<=n;i++){
        
            size[i]=1;
            //初始时自己也算做一个点
            //多维护一个size[]数组,用于记录点的个数。
            p[i]=i;
        }
        while(m-->0){
            String s=in.next();
          if(s.equals("C")){
              int a=in.nextInt();
              int b=in.nextInt();
              if(find(a)!=find(b)){
              //合并两个节点
                  size[find(b)]+=size[find(a)];
            //b的祖宗节点点数加上a的祖宗节点个数
                  p[find(a)]=find(b);
            //a的祖宗节点为b的祖宗节点,合并成一个连通块
          
              }
          }
            else if(s.equals("Q1")){
                int a=in.nextInt();
                int b=in.nextInt();
                if(find(a)==find(b))System.out.println("Yes");
                else System.out.println("No");
            }
            else if(s.equals("Q2")){
                int a=in.nextInt();
                System.out.println(size[find(a)]);
            }
        }
    }
}

食物链

核心思想:

运用并查集,去维护每一个点到根节点的距离,根据同余定理,判断两个点(动物)的关系。
除了维护p[]数组,还需额外维护d[]数组去计算点到根节点的距离,再根据各个点到根节点距离差%3的余数来确定两个点的关系。

余数关系:

余数为1,表示吃根节点。
余数为2,表示可以被根节点吃。
余数为0,表示和根节点是同类。

可以进一步引申出xy,则x到根节点的距离比y到根节点的距离多1

分析图

理解题意

在这里插入图片描述

find()方法

在这里插入图片描述

询问t为1(x、y同类)

在这里插入图片描述在这里插入图片描述

询问t为2(x吃y)

在这里插入图片描述

在这里插入图片描述

代码

import java.util.*;
import java.io.*;
public class Main{
	static int N=50010;
	static int n,m;
	static int []p=new int[N];
	static int []d=new int[N];	
	public static int find(int x) {
		if(p[x]!=x) {
			int t = find(p[x]);//记录根节点
			d[x]+=d[p[x]];//计算x到根节点的距离
			p[x]=t;//x的父节点直接指向根节点
			
		}
		return p[x];
		
	}
	
	public static void main(String []args) throws IOException {
	BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		String []str=in.readLine().split(" ");
		 n=Integer.parseInt(str[0]);
		 m=Integer.parseInt(str[1]);
		for(int i=0;i<n;i++) {
			p[i]=i;//初始化每个点
		}
		int res=0;//假话个数
		
		while(m-->0) {
			String []strs=in.readLine().split(" ");
			int t = Integer.parseInt(strs[0]);
			int x = Integer.parseInt(strs[1]);
			int y=Integer.parseInt(strs[2]);
			
			if(x>n||y>n)res++;// >n表示假话
			
			else {//均在1-n这个集合内
				int px=find(x),py=find(y);//先找到x、y的父节点
				//询问是1,同类关系
				if(t==1) {
					//在同一集合内
					if(px==py&&(d[x]-d[y])%3!=0)res++;//不是同类,为假话
					//不在同一集合内
					else if(px!=py) {
						p[px]=py;//先合并两个集合
						//距离相等,为同类
						d[px]=d[y]-d[x];
					}
					
				}
				//询问是2,吃的关系
				else {
				    //在同一集合内,不满足x吃y的关系,即距离差%3不为0
					if(px==py&&(d[x]-d[y]-1)%3!=0)res++;
					//不在同一集合内
					else if(px!=py)
					{
					     p[px]=py;//先合并两个集合
						//p[px]=p[y];
						//满足吃的关系,更新d[px]
						d[px]=d[y]+1-d[x];
					}
				}
			}
		}
		System.out.println(res);
	}
}

亲戚

公共祖先(亲戚):并查集

分析

判断两个人是不是亲戚,直接判断他们的祖宗是不是同一个人即可。
判断公共祖宗/祖先,用并查集即可
运行时间:4458 ms
没有快读快写,会暴 TLE,只能过8个案例。
TLE.png
快读快写后,可以AC,通过全部案例。
注意:flush()放置在整个while循环之外,不然每一次循环就flush()刷新,需要耗费k倍的刷新时间导致TLE,只需要刷新一次即可。

不清楚并查集的同学可以看这篇题解:
https://www.acwing.com/activity/content/code/content/5321411/

import java.io.*;
public class Main{
	static int N=20010;
	static int p[]=new int[N];
	public static int find(int x) {
		if(p[x]!=x)p[x]=find(p[x]);
		return p[x];
	}
	public static void main(String []args)throws IOException {
		BufferedReader re=new BufferedReader(new InputStreamReader(System.in));
		PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out));
		String str[]=re.readLine().split(" ");
		int n=Integer.parseInt(str[0]);
		int m=Integer.parseInt(str[1]);
		for(int i=1;i<=n;i++) {
			p[i]=i;
		}
		while(m-->0) {
		    String s[]=re.readLine().split(" ");
			int a=Integer.parseInt(s[0]);
			int b=Integer.parseInt(s[1]);
			if(find(a)!=find(b))p[find(a)]=find(b);
		}
		String s1[]=re.readLine().split(" ");
		int k=Integer.parseInt(s1[0]);
		while(k-->0) {
		    String s2[]=re.readLine().split(" ");
			int q1=Integer.parseInt(s2[0]);
			int q2=Integer.parseInt(s2[1]);
			if(find(q1)==find(q2)) {
				pw.println("Yes");
			}
			else {
				pw.println("No");
			}
		}
		pw.flush();//刷新流的位置放在整个while循环外
	}
}

✨ ✨ ✨
看到这里,不妨点个关注 💖

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git 常用命令有哪些

Git 是我们开发工作中使用频率极高的工具&#xff0c;下面总结下他的基本指令有哪些&#xff0c;顺便温习一下。 前言 一般项目中长存2个分支&#xff1a; 主分支&#xff08;master&#xff09; 和开发分支&#xff08;develp&#xff09; 项目存在三种短期分支 &#xff1a…

大数据技术之Clickhouse---入门篇---SQL操作、副本

星光下的赶路人star的个人主页 积一勺以成江河&#xff0c;累微尘以崇峻极 文章目录 1、SQL操作1.1 Insert1.2 Update 和 Delete1.3 查询操作1.4 alter操作1.5 导出数据 2、副本2.1 副本写入流程2.2 配置步骤 1、SQL操作 基本上来说传统关系型数据库&#xff08;以 MySQL 为例…

忘记数据库密码如何处理

windows 5.6.51版本及以前 #当前账号设置密码 set password password(123456); #当前账号取消密码 set password ; &#xff08;1&#xff09;用管理员身份打开控制台输入 net stop m5&#xff08;我的电脑MySQL名字为m5&#xff0c;根据自己的更改&#xff09; &#xff08;…

爱尔眼科四川省区“同心博爱 光明工程”“西部健康公益行”炉霍站启动

8月1日&#xff0c;“同心博爱 光明工程”“西部健康公益行”炉霍站出征仪式在四川爱尔眼科医院隆重举行。 此次公益活动由民革成都市委会、中共锦江区委统战部指导&#xff0c;如意树爱心促进会主办&#xff0c;民革锦江区总支部、爱尔眼科四川省区支持&#xff0c;四川爱尔眼…

Linux系统CPU和磁盘性能进程分析工具pidstat

一、pidstat对CPU的分析 Linux 上的pidstat(1)工具按进程或线程打印CPU 用量&#xff0c;包括用户态和系统态时间的分解。默认情况下&#xff0c;仅循环输出活动进程的信息。例如&#xff1a; 这个例子捕捉到了系统备份&#xff0c;包含了tar(1)命令&#xff0c;从文件系统读取…

低通、高通、带通、阻通滤波器

目录 低通、高通、带通、阻通滤波器 低通、高通、带通、带阻滤波器的区别 通俗理解&#xff1a; 1、低通滤波器 2、高通滤波器 3、带通滤波器 4、带阻滤波器 5、全通滤波器 低通、高通、带通、阻通滤波器 低通、高通、带通、带阻滤波器的区别 低通滤波器&#xff1a;只…

运维高级--tomcat和jpress

1. 简述静态网页和动态网页的区别。 静态网页&#xff1a;事先创建好的网页&#xff0c;通常通过HTML、CSS和JavaScript等静态文件组成&#xff0c;不需要和服务器进行交互&#xff0c;加载速度快 动态网页&#xff1a;根据用户需求动态生成网页&#xff0c;动态网页通常使用…

3D软件性能的基准测试工具,侧重于测试处理器和显卡,赶紧试试

如果需要&#xff0c;Cinebench 可帮助您评估计算机执行渲染任务的性能。Cinebench 由 Maxon 开发&#xff0c;利用行业标准基准测试技术来评估您的系统在要求苛刻的图形任务中的性能。 它主要侧重于测试处理器和显卡&#xff0c;以确定其渲染复杂 3D 图像和动画的效率。Cineb…

Spring 容器原始 Bean 是如何创建的?

以下内容基于 Spring6.0.4。 这个话题其实非常庞大&#xff0c;我本来想从 getBean 方法讲起&#xff0c;但一想这样讲完估计很多小伙伴就懵了&#xff0c;所以我们还是一步一步来&#xff0c;今天我主要是想和小伙伴们讲讲 Spring 容器创建 Bean 最最核心的 createBeanInstan…

笔试编程题常用框架/方法

目录 考核方式 ACM模式 JavaScript(V8) JavaScript(Node) 数组 折半 / 二分查找 螺旋矩阵* 前缀和-区间求和 差分数组-区间增减 滑动窗口-子串 链表 双指针&#xff08;快慢指针&#xff09; 有序数组的平方 删除/覆盖数组元素 最小长度的子数组 三数之和abcta…

【RTT驱动框架分析05】-spi驱动框架分析

spi 1.应用层的spi操作 spi 消息结构 struct rt_spi_message {const void *send_buf;//发送数据的缓存void *recv_buf;//接收数据的缓存rt_size_t length;//数据长度struct rt_spi_message *next;//指向下一个消息结构unsigned cs_take : 1;//是否执行获取csunsigned cs_…

SQL-每日一题【1174. 即时食物配送 II】

题目 配送表: Delivery 如果顾客期望的配送日期和下单日期相同&#xff0c;则该订单称为 「即时订单」&#xff0c;否则称为「计划订单」。 「首次订单」是顾客最早创建的订单。我们保证一个顾客只会有一个「首次订单」。 写一条 SQL 查询语句获取即时订单在所有用户的首次订…

零碎小知识点汇总——记录工作中遇到的问题——基础积累

1.npm install安装包时&#xff0c;常用的-S -D有什么区别&#xff1f; 参考链接&#xff1a;https://blog.csdn.net/sunyctf/article/details/127667543 主要的区别就是依赖配置写入package.json文件的位置不同而已 npm install有一个别名&#xff1a;npm i -S:写入dependen…

抢夺本地生活万亿蛋糕:“抖音美团们”的攻防战

有人就有市场&#xff0c;有市场就有竞争。面对本地生活这一大“富矿”&#xff0c;互联网大厂们正在开启一场争夺战。 前有抖音、小红书在团购业务上火速推进&#xff0c;近日&#xff0c;随着拼多多正式上线本地生活入口&#xff0c;这个领域的玩家越来越多。 艾瑞咨询数据…

Linux中的特殊进程(孤儿进程、僵尸进程、守护进程)

一、孤儿进程 1&#xff09;父进程退出&#xff0c;子进程不退出&#xff0c;此时子进程被1号&#xff08;init&#xff09;进程收养&#xff0c;变成孤儿进程。 2&#xff09;孤儿进程会脱离终端控制&#xff0c;且运行在后端&#xff0c;不能用ctrlc杀死后端进程&#xff0c;…

Linux ALSA音频工具aplay、arecord、amixer的使用方法

ALSA 是Advanced Linux Sound Architecture的缩写&#xff0c;先进的Linux音频架构&#xff0c;为Linux操作系统提供音频和MIDI功能。 aplay命令 aplay是播放命令。 rootimx6ul7d:~# aplay -h Usage: aplay [OPTION]... [FILE]...-h, --help help--version …

MyBatis-Plus 和达梦数据库实现高效数据持久化

一、添加依赖 首先&#xff0c;我们需要在项目的 pom.xml 文件中添加 MyBatis-Plus 和达梦数据库的依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifac…

pyspark_自定义udf_解析json列【附代码】

pyspark_自定义udf_解析json列【附代码】 一、背景&#xff1a;二、调研方案&#xff1a;三、利用Pyspark udf自定义函数实现大数据并行计算整体流程案例代码运行结果&#xff1a;案例代码&#xff1a;代码地址&#xff1a;代码 一、背景&#xff1a; 车联网数据有很多车的时…

【MATLAB第63期】基于MATLAB的改进敏感性分析方法IPCC,拥挤距离与皮尔逊系数法结合实现回归与分类预测

【MATLAB第63期】基于MATLAB的改进敏感性分析方法IPCC&#xff0c;拥挤距离与皮尔逊系数法结合实现回归与分类预测 思路 考虑拥挤距离指标与PCC皮尔逊相关系数法相结合&#xff0c;对回归或分类数据进行降维&#xff0c;通过SVM支持向量机交叉验证得到平均指标&#xff0c;来…

《华为认证》SR MPLS BE配置

实验需求&#xff1a;在PE1和PE3之间建立mp-bgp邻居传递CE1和CE2的私网路由&#xff0c;并且使用SR mpls BE的方式传递私网流量 实验步骤 步骤1&#xff1a;配置设备接口ip地址以及AS 100内的igp协议&#xff08;略&#xff09; 步骤2&#xff1a;AS 100内的设备开启mpls &am…