ST表和并查集【2024蓝桥杯0基础】-学习笔记

文章目录

    • ST表-用于优化RMQ问题
      • 状态分析
      • 例题分析
        • 代码复现
    • 并查集
      • 例题分析1
        • 代码复现
      • 例题分析2
        • 状态分析
        • 代码复现
    • 合并并查集的方法
      • 启发式合并:按照子树的节点大小
      • 按秩合并:按照子树的深度
    • 可撤销并查集
    • 带权并查集
        • 代码复现
      • 例题分析
        • 思路分析
  • 感悟

ST表-用于优化RMQ问题

在这里插入图片描述

在这里插入图片描述

状态分析

在这里插入图片描述
在这里插入图片描述
因为一般指数都会向上取整,所以询问的时候都会把数组区间囊括
在这里插入图片描述

例题分析

在这里插入图片描述

代码复现
import math
def st_init(n,a):
    L = math.ceil(math.log2(n) + 1)
    #[i][j]表示区间[i,i+2^j-1]的最大值
    f = [[0]*L for i in range(n)]
    #边界
    for i in range(n):
        f[i][0] = a[i]
    #打表
    for j in range(1, L):
        pj = 1 <<(j - 1)
        for i in range(n-pj):
            f[i][j] = max(f[i][j - 1],f[i + pj][j - 1])
    return f
def query(f, l, r):
    s = int(math.log2(r-l+1))
    return max(f[l][s], f[r-(1<<s) + 1][s])

N,Q = map(int,input().split())
a = list(map(int,input().split()))
f = st_init(N,a)
for _ in range(Q):
    l, r = map(int,input().split())
    l, r = l-1, r-1
    print(query(f,l,r))

并查集

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

例题分析1

在这里插入图片描述

代码复现
#运用到路劲压缩
def Findroot(x):
    if x == p[x]:
        return x 
    p[x] = Findroot(p[x])
    return p[x]

def Merge(x, y):
    rootx, rooty = Findroot(x), Findroot(y)
    p[rootx] = rooty

def Query(x, y):
    #查询集合x, y是否属于同一个集合
    rootx,rooty = Findroot(x), Findroot(y)
    return rooty == rootx

n, m = map(int,input().split())
p = list(range(n+1))
for _ in range(m):
    op, x, y = map(int,input().split())
    if op == 1:
        Merge(x, y)
    else:
        if Query(x, y):
            print("YES")
        else:
            print("NO")

例题分析2

很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系。某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。
现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通块的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一个连通块中)
输入描述
输入第一行包含两个整数n,m,分别表示星球的数目和以太隧道的数目。星球用0~n-1的整数编号。接下来的 m 行,每行包括两个整数 x,y,表示星球 x和星球 y之间有“以太”隧道,可以直接通讯。接下来的一行为一个整数 k,表示将遭受攻击的星球的数目。接下来的k行,每行有一个整数,按照顺序列出了帝国军的攻击目标。这k个数互不相同,且都在 0到n-1的范围内。
其中,1≤m≤2x10’,1≤n≤2m,x≠y.

状态分析

在这里插入图片描述

代码复现
def Findroot(x):
    if x == p[x]:return x
    p[x] = Findroot(p[x])
    return p[x]

n,m = map(int,input().split())
p = list(range(n))

#邻接表存图
g = [[] for _ in range(n)]
for _ in range(m):
    x, y = map(int,input().split())
    g[x].append(y)
    g[y].append(x)
#所有被毁的点
destory = []
vis = [0] * n #标记是否被损毁
k = int(input())
for _ in range(k):
    x = int(input())
    destory.append(x)
    vis[x] = 1
res = n - k
for u in range(n):
    if vis[u]: continue
    for v in g[u]:
        if vis[v]:continue
        rootu, rootv = Findroot(u), Findroot(v)
        if rootu != rootv:
            p[rootu] = p[rootv]
            res -=1
ans = [res]
#逐步建边
for u in destory[::-1]:
    vis[u] = 0
    res +=1
    for v in g[u]:
        if vis[v]: continue
        rootu, rootv = Findroot(u), Findroot(v)
        if rootu != rootv:
            p[rootu] = p[rootv]
            res -= 1
    ans.append(res)
for x in ans[::-1]:
    print(x)

合并并查集的方法

启发式合并:按照子树的节点大小

在这里插入图片描述

按秩合并:按照子树的深度

在这里插入图片描述

可撤销并查集

可撤销并查集(Reversible Union-Find)是一种扩展了标准并査集(Union-Find)数据结构的数据结构,它允许在进行连接(Union)和查询(Find)操作的同时,能够回退(Undo)或者撤销之前的操作。这种数据结构通常用于支持一些需要回滚操作的应用,比如在离线算法中,或者需要进行回退的决策问题中。当然主要是应用于在线算法,因为离线算法反悔可以完全输入后在一起处理。

带权并查集

就是每一条边现在的权值都不是固定的
在这里插入图片描述
在这里插入图片描述

代码复现
def find(x):
    if f[x] == x:
        return x
    fa = find(f[x])
    dis[x] += dis[f[x]]
    f[x] = fa
    return f[x]

寻找函数的代码更改如下:

在这里插入图片描述

例题分析

在这里插入图片描述

思路分析

在这里插入图片描述

感悟

后面部分都是属于并查集的提升,结合了前缀和和路径的权重都是基于并查集的原理,有点难理解但是多做题就好了!

蓝桥杯云课学习笔记分享,欢迎大佬们批评指正!

一直在进步就好咯!

by 闻不多

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

android emulator windows bat启动

android emulator windows bat启动 先上结果 // 模拟器路径 -netspeed full -avd 模拟器名称 C:\Users\name\AppData\Local\Android\Sdk\emulator\emulator.exe -netdelay none -netspeed full -avd Pixel_3a_API_34_extension_level_7_x86_64一般来说 windows 如果不做…

小游戏-扫雷

扫雷大多人都不陌生&#xff0c;是一个益智类的小游戏&#xff0c;那么我们能否用c语言来编写呢&#xff0c; 我们先来分析一下扫雷的运行逻辑&#xff0c; 首先&#xff0c;用户在进来时需要我们给与一个菜单&#xff0c;以供用户选择&#xff0c; 然后我们来完善一下&#…

Mac电脑高清媒体播放器:Movist Pro for mac下载

Movist Pro for mac是一款专为Mac操作系统设计的高清媒体播放器&#xff0c;支持多种常见的媒体格式&#xff0c;包括MKV、AVI、MP4等&#xff0c;能够流畅播放高清视频和音频文件。Movist Pro具有强大的解码能力和优化的渲染引擎&#xff0c;让您享受到更清晰、更流畅的观影体…

疫情居家办公OA系统设计与实现| Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;…

Netty剖析 - Why Netty

文章目录 Why NettyI/O 请求的两个阶段I/O 模型Netty 如何实现自己的 I/O 模型线程模型 - 事件分发器&#xff08;Event Dispather&#xff09;弥补 Java NIO 的缺陷更低的资源消耗网络框架的选型Netty 发展现状Netty 的使用 Why Netty I/O 模型、线程模型和事件处理机制优化&a…

Spring Cloud四:微服务治理与安全

Spring Cloud一&#xff1a;Spring Cloud 简介 Spring Cloud二&#xff1a;核心组件解析 Spring Cloud三&#xff1a;API网关深入探索与实战应用 文章目录 一、服务注册中心的选型与最佳实践1. 主流服务注册中心概述2. 最佳实践建议(1)、选型建议(2)、高可用性与稳定性1). 高可…

游戏引擎中的地形系统

一、地形的几何 1.1 高度图 记录不同定点的高度&#xff0c;对每个网格/顶点应用高度、材质等信息&#xff0c;我们每个顶点可以根据高度改变位移 但是这种方法是不适用于开放世界的。很难直接画出几百万公里的场景 1.2 自适应网格细分 当fov越来越窄的时候&#xff0c;网格…

学习SpringBoot笔记--知识点(1)

目录 SpringBoot介绍 创建一个最基础的springbooot项目 使用Spring Initializr创建springboot项目 Spring Boot 自动配置机制 SpringBoot常用注解 1.组件注册 2.条件注解 3.属性绑定 SpringBoot自动配置流程​编辑 学习SpringBoot的方法 ​编辑 SpringBoot日志配置…

机器学习周记(第三十一周:文献阅读-GGNN)2024.3.18~2024.3.24

目录 摘要 ABSTRACT 1 论文信息 1.1 论文标题 1.2 论文模型 1.2.1 数据处理 1.2.2 门控图神经网络 1.2.3 掩码操作 2 相关知识 2.1 图神经网络&#xff08;GNN&#xff09; 2.2 图卷积神经网络&#xff08;GCN&#xff09; 3 相关代码 摘要 本周阅读了一篇利用图神…

银行监管报送系统介绍(六):客户风险数据报送系统

【概念定义】 银监会决定从2013年起实行新版客户风险统计制度&#xff0c;对各政策性银行、国有商业银行、股份制商业银行进行客户信息汇总统计。 客户风险统计信息&#xff0c;是指新版客户风险统计报送信 息。客户风险统计报送信息包括但不限于对公及同业客户授信和 表内外业…

ClickHouse--11--物化视图

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.物化视图什么是物化视图? 1.1 普通视图1.2 物化视图1.3 优缺点1.4 基本语法1.5 在生产环境中创建物化视图1.6 AggregatingMergeTree 表引擎3.1 概念3.2 Aggregat…

【Linux】Linux工具学习之git

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 前言一、账号注册1.1 GitHub与Gitee 二、构建仓库三、安装git 四、配置git五、克…

树状数组原理和代码

树状数组 求下标的对应 求i管着的下标的范围 方法&#xff1a;拆掉最右侧的1然后1 到你自己 query sum 1-i的和 拆掉最右侧的1 再把下一个数值吸收到sum 重复这个过程直到全变0为止 add 方法&#xff1a;加上最右侧的1 到上限为止 lowbit方法 单点增加范围查询模板 #inc…

Redis持久化【RDB,bgsave的写时复制机制】【AOF,aof重写机制】【Redis混合持久化,以及对应改变aof重写规则】【Redis数据备份策略】

Redis持久化 RDB快照&#xff08;snapshot&#xff09;bgsave的写时复制(COW)机制 AOF&#xff08;append-only file&#xff09;AOF重写 Redis 4.0 混合持久化开启持久化后&#xff0c;AOF重写规则发生了变化 Redis数据备份策略&#xff1a; 转自 图灵课堂 RDB快照&#xff0…

第390场 LeetCode 周赛题解

A 每个字符最多出现两次的最长子字符串 滑动窗口&#xff1a;枚举窗口的左边界&#xff0c;尽可能右移窗口的右边界。 (当然也可以暴力枚举) class Solution { public:int maximumLengthSubstring(string s) {vector<int> cnt(26);int res 0;for (int l 0, r -1, n s…

python第三方库的安装,卸载和更新,以及在cmd下pip install安装的包在pycharm不可用问题的解决

目录 第三方库pip安装&#xff0c;卸载更新 1.安装&#xff1a; 2.卸载 3.更新 一、第三方库pip安装&#xff0c;卸载更新 1.安装 pip install 模块名 加镜像下载&#xff1a;pip install -i 镜像网址模块名 常用的是加清华镜像&#xff0c;如 pip install -i https://pyp…

jmeter链路压测

比如登录后返回token&#xff0c;业务打印上传的操作需要用到token 线程组中添加登录请求&#xff0c;并执行 1、添加登录并执行&#xff0c;查看结果 2、结果树中下拉选择正则表达式&#xff0c;将token参数和值复制粘贴到下方&#xff0c;将token值改为(.*?)&#xff0…

Pinctrl子系统_05_Pincontroller构造过程情景分析

上一节我们了解了Pinctrl子系统主要的数据结构&#xff0c;要想更好的掌握Pinctrl子系统&#xff0c;还需要知道他的构造过程。 本节我们就来分析一下Pinctrl子系统的构造过程。 以内核面向对象的思想&#xff0c;设备树可以分为两部分&#xff0c;左边是Pinctrl子系统节点&a…

毕业论文降重(gpt+完美降重指令),sci论文降重gpt指令——超级好用,重复率低于4%

1. 降重方法&#xff1a;gpt降重指令 2. gpt网站 https://yiyan.baidu.com/ https://chat.openai.com/ 3. 降重指令——非常好用&#xff01;&#xff01;sci论文&#xff0c;本硕大论文都可使用&#xff01; 请帮我把下面句子重新组织&#xff0c;通过调整句子逻辑&#xff0…

牛客NC218 检测循环依赖【中等 图 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/8dc02ad98553432a90affc3a0484910b 思路 图的基本知识要理解&#xff0c;一般用Map来表示 图解决拓扑排序&#xff0c;依赖之类的问题 感觉课程数在这道题里面可以不用&#xff0c;因为没有规定所有课程都得有先…