蓝桥杯刷题025——推导部分和(加权并查集)

news2024/9/21 12:21:36

2022省赛

问题描述

对于一个长度为 N 的整数数列 A_i,A_2,...A_N​, 小蓝想知道下标 l 到 r 的部 分和\sum_{j=l}^{r_i}=A_{l}+A_{l+1}+...+A_{r}是多少?

然而, 小蓝并不知道数列中每个数的值是多少, 他只知道它的 M 个部分和 的值。其中第 i 个部分和是下标 l_i​ 到 r_i 的部分和 \sum_{j=l_i}^{r_i}=A_{l_i}+A_{l_i+1}+...+A_{r_i}, 值是 S_i  。

输入格式

第一行包含 3 个整数 N、M 和 Q 。分别代表数组长度、已知的部分和数量询问的部分和数量

接下来 M 行, 每行包含 3 个整数 l_i,r_i,S_i 。

接下来 Q 行, 每行包含 2 个整数 l 和 r, 代表一个小蓝想知道的部分和。

输出格式

对于每个询问, 输出一行包含一个整数表示答案。如果答案无法确定, 输出 UNKNOWN。

样例输入

5 3 3
1 5 15
4 5 9
2 3 5
1 5
1 3
1 2

样例输出

15
6
UNKNOWN

【题目大意】 

对于一个序列,给出若干个局部区间和
再询问是否可以通过上述区间和计算出指定[L,R]的区间和

【思路】

求区间和,很容易联想到前缀和[L,R]的区间和:s[R] - s[L-1]
情景:
若已知[2,4],[5,7]的区间和,那么[2,7]的区间和就可以计算出来
区间[2,7]相当于把[2,4]和[5,7]合并了起来
可以通过并查集实现区间的合并,合并后整个大区间内的任意两个下标之间一定可以计算出区间和

解题关键:带权并查集

  • 我们把序列的每个元素的下标当成一个节点,每给出一对已知的区间和[L,R],我们就把下标L-1和R合并到一个集合中
  • 合并集合的过程中,除了L-1,R两个端点,我们还需要记录区间和,可以额外建立一个保存权值的列表,使用带权并查集维护。
  • 此题的权值d[ ]d[x]表示x和祖宗节点fx的距离,值为x-fx

知识补充:加权并查集
由于此题中,两个点维护集合时存在差值关系,因此使用并查集时,需要额外维护权值

假设:d[ ]权值数组,d[x]表示x到父节点的权值,经过路径压缩后,d[x]应表示为x到祖宗节点的权值

加权并查集的路径压缩

路径压缩后的权值变化
d[1]' = d[1]+d[2]+d[3]

d[2]' = d[2]+d[3]
d[3]' = d[3]
d[4]' = d[4] 

举例:对样例进行加权并查集的路径压缩

 带权值的路径压缩代码模板

def get_father(x :int):    #并查集组合的合并
    if x != father[x]:
        t = father[x]      #带权值的路径压缩,需要先记下father
        father[x] = get_father( father[x])
        d[x] += d[t]
    return father[x]

权值除了在路径压缩时需要更新外,在合并集合时,也需要更新

合并(x,y,s)时:    (注:s为[x,y]的区间和)
若fx,fy是x,y的祖宗节点,则合并fx,fy(将fx合并到fy)时d[fx] =s +d[y] - d[x]

 为什么是d[fx] =s +d[y] - d[x]?下面解释一下:

​​​d[x] = x - fx

d[y] = y - fy

所以:d[fx] = fx - fy = x- d[x] - (y - d[y]) = d[y] - d[x] + (x-y) = d[y] - d[x] + s

  • 使用加权并查集,对于每对已知的左端点L,右端点R,和s,将L-1和R合并,合并过程中更新权值
  • 所有已知区间和的合并操作完成后,对于接下来的每个查询[L1,R1]区间和,判断L1-1,R1是否属于同一集合,如果是,那么d[L1-1]-d[R]即为[L1,R1]的区间和,如果不是,说明此时的区间和无法求解。

 【代码】

N, M, Q = map(int, input().split())
father = [0] * (N + 10)
d = [0] * (N + 10)
def init(n):
    for i in range(1, n + 1):
        father[i] = i
def find_father(x):
    if x != father[x]:
        t = father[x]  # 带权值的路径压缩,需要先记下father
        father[x] = find_father(father[x])
        d[x] += d[t]   # 累加上一层的权值
    return father[x]

init(N)
for i in range(M):
    l, r, w = map(int, input().split())
    fl, fr = find_father(l - 1), find_father(r)  # 找出父节点
    if fl != fr:            # 不是在一个集合
        father[fl] = fr     # 将fr加入fl集合
        d[fl] = d[r] - d[l - 1] + w

ans = []
for i in range(Q):
    l, r = map(int, input().split())
    fl, fr = find_father(l - 1), find_father(r)
    if fl != fr:
        # print("UNKNOWN")
        ans.append("UNKNOWN")
    else:
        # print(d[l - 1] - d[r])
        ans.append(d[l - 1] - d[r])

for i in ans:
    print(i)

 

 

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

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

相关文章

Java 如何通过JDBC 操作MySQL数据库

Java 如何通过JDBC 操作MySQL数据库开发准备实际开发1,加载并注册JDBC 驱动2,创建数据库连接3,创建Statement 对象4,遍历查询结果5,关闭连接,释放资源完整代码实现JDBC 是Java 数据库连接,即 Ja…

客户服务知识库的最佳实践7个步骤

每个公司的声誉都依赖于客户,如果客户因为想要购买你的产品找到你,但是了解到你的客户服务做的不好,可能也会放弃你的产品,就像市场营销依赖于潜在客户的关系一样,公司的服务部门也需要依赖于现有客户的关系&#xff0…

OCT 医学图像分类

目录1. OCT 图像分类2. OCT图像数据集3. OCT图像预处理4. 特征提取5. 实验结果及分析github地址: https://github.com/aishangcengloua/OCT_Classification 1. OCT 图像分类 视网膜光学相干断层扫描(OCT)是一种成像技术,用于捕获活体患者视网膜的高分辨率横截面。…

Skywalking8.5.0-ES7 Rancher部署及ES高可用部署过程记录

背景 近期本司内部需要用到Skywalking进行链路追踪和日志收集,故记录下部署过程,方便后期学习与查询。 ElasticSearch高可用部署 ## 1.docker启动elasticsearch,并将内存设置的稍微大一些,然后进行端口和配置文件映射 docker run --name…

windows 安装Qt

下载 下载地址https://download.qt.io/,此文已5.7.0为例子。 根据图片依次选择即可。 安装 安装过程参考另一篇文章Ubuntu 安装 Qt5.7.0即可 配置环境变量 ps:我就是之前没配置环境变量,直接使用创建项目,项目源码直接运行是…

Shader Graph简介

使用着色器(shader)和材质(material),我们能够创造出非常多有趣的效果。除了Unity自带的shader外,还可以自己编写shader或使用其他人所编写的shader。编写shader通常需要我们了解shader编程语言的语法和相关…

IO流详解及常用方法

1.1. 什么是IO流IO流: Input/Output Stream流: 指的是一串流动的数据, 在数据在流中按照指定的方向进行流动。 实现数据的读取、写入的功能。1.2. IO流的使用场景使用File类, 只能做关于文件的操作, 获取属性、 创建文件、 删除文…

数字化时代,如何做好用户体验与应用性能管理

引言 随着数字化时代的到来,各个行业的应用系统从传统私有化部署逐渐转向公有云、行业云、微服务,这种变迁给运维部门和应用部门均带来了较大的挑战。基于当前企业 IT 运维均为多部门负责,且使用多种运维工具,因此,当…

[numpy算法复现]-第27节 Apriori算法原理(相关性)

文章目录 0. 结论1. 算法起源2. Apriori算法思想2.1 算法综述2.2 示例0. 结论 Apriori算法是常用的用于挖掘出数据关联规则的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合的模式有助于我们做一些决策。比如在常见的超市购物数据集,或者电商的网购数据集中,如果…

公会发展计划(GAP)第三季

继前两季发布的公会发展计划取得成功之后,Yield Guild Games 现在推出了第三季的公会发展计划(GAP)。GAP 在第二季有了显著的增长,有超过 3000 个成就 NFT 被铸造。GAP 是以成就为导向的社区代币分配协议,下一次迭代将…

实验一 基于MATLAB语言的线性离散系统的Z变换分析法

实验一 基于MATLAB语言的线性离散系统的Z变换分析法 一、实验目的 1. 学习并掌握 Matlab 语言离散时间系统模型建立方法; 2.学习离散传递函数的留数分析与编程实现的方法; 3.学习并掌握脉冲和阶跃响应的编程方法;…

智慧校园:电子班牌+家长端小程序源码

说到智慧校园家长端微信小程序大家有多少了解呢?它有哪些优点和功能呢? 下面就来说说智慧校园家长端微信小程序的特色和优点。 1.学生通过闸机人脸、刷卡进出校,如出校则推送给家长小程序孩子已离校的信息,如进校则实时推送孩子已进校信息…

解决Visual Studio Code 热键冲突

因为最近很火的ChatGPT,更新了VSCode的版本,但是界面和配置有了一些变化,原来的热键也有所调整,在使用markdown的时候,enter键竟然都出现了冲突,在此记录一下操作步骤,非常简单。 报错如下&…

为什么要用数据库视图?

视图的定义 视图(View)是一种虚拟的表,其结构和数据来自于一个或多个基本表,可以被当作普通表一样进行查询操作,但实际上不存储任何数据。在数据库中,视图可以被看作是一种数据访问的方式,它可…

16.hadoop系列之MapReduce之MapTask与ReduceTask及Shuffle工作机制

1.MapTask工作机制 以上内容我们之前文章或多或少介绍过,就已网络上比较流行的该图进行理解学习吧 MapTask分为五大阶段 Read阶段Map阶段Collect阶段溢写阶段Merge阶段 2.ReduceTask工作机制 ReduceTask分为三大阶段 Copy阶段Sort阶段Reduce阶段 3.ReduceTask并…

eBPF双子座:天使or恶魔?

启示录 新约圣经启示录认为:恶魔其实本身是天使,但炽天使长路西法背叛了天堂,翅膀变成了黑色,坠落地狱,堕落成为恶魔。这些恶魔主宰著黑暗势力,阻碍人类与上帝沟通,无所不用其极。所以可以说天…

box-shadow详解

box-shadow详解 属性定义及使用说明 box-shadow属性可以设置一个或多个下拉阴影的框。 语法 box-shadow: h-shadow v-shadow blur spread color inset;注意:boxShadow 属性把一个或多个下拉阴影添加到框上。该属性是一个用逗号分隔阴影的列表,每个阴…

使用多种算法对sin函数进行拟合-学习记录

1.使用linear层拟合 原代码链接在这里,效果如下: 2.使用LSTM预测 原代码链接在这里,效果如下: 3.使用GAN拟合 忘记代码哪里找的了,不过效果很差。 4.使用LSTM-GAN 这个代码在GitHub上找的,然后改了改&…

3、内存管理

文章目录1、内存的基础知识1.1、什么是内存?1.2、进程的运行原理--指令1.3、逻辑地址 & 物理地址1.4、从写程序到程序运行1.5、装入模块到运行1.6、装入的三种方式--绝对装入1.7、装入的三种方式--静态重定位1.8、装入的三种方式--动态重定位(重定位…

移动WEB开发四、rem布局

零、文章目录 文章地址 个人博客-CSDN地址:https://blog.csdn.net/liyou123456789个人博客-GiteePages:https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee:https://gitee.com/bluecusliyou/TechLearnGithub:https:…