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

news/2024/4/19 11:41:28/文章来源:https://blog.csdn.net/m0_69478345/article/details/129128565

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]      #带权值的路径压缩,需要先记下fatherfather[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]  # 带权值的路径压缩,需要先记下fatherfather[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] + wans = []
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.luyixian.cn/news_show_71815.aspx

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

相关文章

基于DSP+FPGA的机载雷达伺服控制系统的硬件设计与开发

机载雷达是以飞机为载体的各种雷达天线的总称,主要用于空中侦察、警戒、保 证航行准确与安全[1]。随着航空航天技术的飞速发展,以及微电子、计算机和高速集 成电路等新型技术在军事领域的广泛应用[2],各国都研制出了许多新型战机和导弹,机 载…

企业微信的聊天机器人来了,免费下载(Python版)

大家好,这里是程序员晚枫,个人网址:python-office.com 上次分享了微信机器人的视频以后,视频下面有一个热门评论: 什么时候开发企业版微信机器人?自动回复、自动群发等等~ 在经历了一段时间的查找和开发以…

【基础算法】之 冒泡排序优化

冒泡排序思想基本思想: 冒泡排序,类似于水中冒泡,较大的数沉下去,较小的数慢慢冒起来(假设从小到大),即为较大的数慢慢往后排,较小的数慢慢往前排。直观表达,每一趟遍历,…

Docker----------day3

常规安装大体步骤 1.安装tomcat 1.查找tomcat docker search tomcat2.拉取tomcat docker pull tomcat3.docker images查看是否有拉取到的tomcat 4.使用tomcat镜像创建容器实例(也叫运行镜像) docker run -it -p 8080:8080 tomcat5.新版tomcat把webapps.dist目录换成webapp…

【大数据离线开发】7.4 HBase数据保存和过滤器

7.4 数据保存的过程 注意:数据的存储,都需要注意Region的分裂 HDFS:数据的平衡 ——> 数据的移动(拷贝)HBase:数据越来越多 ——> Region的分裂 ——> 数据的移动(拷贝) …

清理bib文件(删除重复项,仅保留tex中引用的条目)

在写latex文件的过程中,经常会遇到添加了一堆文献的bibtex到bib文件中,有时候文章一长同一篇文献用不同的cite-key引用了多次,同时也会有一些文献最后并没被正文引用,这就需要对bib文件进行清理。 删除重复项 可以用JabRef 在J…

经理与员工工资关系-课后程序(JAVA基础案例教程-黑马程序员编著-第四章-课后作业)

【案例4-6】经理与员工工资案例(利用多态实现) 欢迎点赞关注收藏 【案例介绍】 案例描述 某公司的人员分为员工和经理两种,但经理也属于员工中的一种,公司的人员都有自己的姓名和地址,员工和经理都有自己的工号、工…

不同投票需要的不同上传方式outlook 投票功能怎么设置投票 html5

“艺空间手造坊”网络评选投_投票方式的选择_免费图文教学投票教学关于微信投票,我们现在用的最多的就是小程序投票,今天的网络投票,在这里会教大家如何用“活动星投票”小程序来进行投票。我们现在要以“艺空间手造坊”为主题进行一次投票活…

AcWing1015.摘花生

AcWing 1015. 摘花生Hello Kitty想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它…

Java并发知识点

文章目录1. start()和run()方法的区别?2. volatile关键字的作用?使用volatile能够保证:防止指令重排3. sleep方法和wait方法有什么区别?sleep()方法4. 如何停止一个正在运行的线程?方法一:方法二&#xff1…

多重继承的虚函数表

同一个类,不同对象使用同一张虚函数表 不同类使用不同的虚函数表 子类自己添加的虚函数(非重写),在VS中是将此放在第一个继承类的虚函数表里. #include <iostream> using namespace std;class Father { public:virtual void func1() { cout << "Father::f…

<Linux>vscode搭建Linux远程开发工具

一、下载vscode&#x1f603;可以去vscode的官网下载&#xff0c;不过是外网下载速度较慢提速可以参考&#xff1a;(81条消息) 解决VsCode下载慢问题_vscode下载太慢_wang13679201813的博客-CSDN博客官网&#xff1a;Visual Studio Code - Code Editing. Redefined这里推荐的是…

【数据结构】二叉树的四种遍历

写在前面首先二叉树是一个大家族&#xff0c;这篇文章就讲一讲二叉树的遍历&#xff1a;递归遍历迭代遍历先识概念二叉树的存储结构&#xff0c;可以为顺序存储&#xff0c;即使用数组&#xff1b;也可以为链式存储&#xff0c;即使用链表。我们使用较多的就是链式存储结构&…

Ceres的自动求导实现原理剖析

目录数学原理实现原理总结首先注意数值求导和自动求导在使用的时候的不同之处。 实际上&#xff0c;正是自动求导这个地方使用了类模板&#xff0c;导致它不仅可以传入参数&#xff0c;还可以传入Jet类型的数据&#xff0c;从而实现了参数的雅可比矩阵的计算&#xff0c;完成自…

TPM密钥管理、使用

前面讲过证书相关内容&#xff0c;除了在软件方面有所应用外&#xff0c;在硬件方面也有很多应用。本次讲一下TPM相关的内容。 一、TPM介绍 1.1背景 TCG基于硬件安全的架构是为应对1990s后期日益增多的复杂恶意软件攻击应用而生的。当时以及现在&#xff0c;抵御PC客户端网络…

树状数组(高级数据结构)-蓝桥杯

一、简介树状数组 (Binary Indexed Tree,BIT)&#xff0c;利用数的二进制特征进行检索的一种树状结构。一种真正的高级数据结构&#xff1a; 二分思想、二叉树、位运算、前缀和。高效!代码极其简洁!二、基本应用数列a1,a2,....,an&#xff0c;操作&#xff1a;单点修改&#xf…

详解HashMap

目录 1.hash code 2.数据结构 3.初始化 4.存取 4.1.put 4.2.get 5.迭代 6.扩容 7.JDK1.7版本存在的问题 7.1.性能跌落 7.2.循环链表 8.散列运算 9.扰动函数 1.hash code hash code是使用hash函数运算得到的一个值&#xff0c;是对象的身份证号码&#xff0c;用于…

OpenSumi 是信创开发云的首选

原文作者&#xff1a;行云创新技术总监 邓冰寒 引言 随着云原生应用的日益普及&#xff0c;开发上云也逐步被越来越多的厂商和开发者接受&#xff0c;在这个赛道国内外有不少玩家&#xff0c;国外的 GitHub Codespaces、CodeSandbox&#xff0c;GitPod、亚马逊 Cloud9&#xf…

借力英特尔® Smart Edge,灵雀云 ACP 5G 专网解决方案获得多维度优化加速

近日&#xff0c;灵雀云联合英特尔推出了集成Smart Edge 模块的灵雀云 ACP 5G 专网解决方案&#xff0c;同时共同发布了《借力英特尔 Smart Edge&#xff0c;基于云原生解决方案的灵雀云 ACP 5G 专网版本获得多维度优化加速》白皮书。 得益于云计算技术和 5G 网络的高速发展&am…

Win10 环境 安卓ollvm编译与配置 ndk代码混淆加密

确定你正在使用的ndk版本 查看build.gradle ndkVersion 21.4.7075529 确定你使用的ndk的ollvm版本 C:\Users\Administrator\AppData\Local\Android\Sdk\ndk\21.4.7075529\toolchains\llvm\prebuilt\windows-x86_64\bin\llvm-config.exe --version 9.0.9svn 确定了ollvm版本后…