差分与前缀和

目录

差分法

例题:大学里的树木要打药

前缀和

例题:大学里的树木要维护

差分法

差分法的应用主要是用于处理区间问题,当一个数组要在很多不确定的区间,加上相同的一个数,我们如果每个数都进行加法操作的话,那么复杂度O\left ( mn \right )是平方阶的,非常消耗时间。

如果我们使用差分法,将数组拆分,构造出一个新的拆分数组,通过对数组区间的端点进行加减操作最后将数组合并就能完成原来的操作。这样处理后,时间复杂度降为O\left ( n \right )

差分法的特点:

1.将对于区间的加减操作转化为对于端点的操作。

2.时间复杂度为O\left ( n \right )

3.用于维护区间的增减但不能维护乘除。

4.差分后的序列比原来的数组序列多一个数。

//读入原始数据
输入n,m
原始数组 a[]
差分数组 b[]for i(1-n)输入a[i]//差分
for i(1-n)b[i]=a[i]-a[i-1]//m次区间操作while(m--)输入l,r,value区间加法改为:b[l]+=valueb[r+1]-=value区间减法改为:b[l]-=valueb[r+1]+=value//差分还原
for i(1-n)a[i]=b[i]+a[i-1]

例题:大学里的树木要打药

题目

教室外有N棵树,根据不同的位置和树种,学校要对其上不同的药。因为树的排列成线性,且非常长,我们可以将它们看作一条直线给他们编号。树的编号从0~N-1且N<1e6。

对于树的药是成区间分布的,比如3-5号的树靠近下水道,所以它们要用驱蚊虫的药,20-26号的树,它们排水不好,容易涝所以要给他们促进根系的药。诸如此类,每种不同的药要花不同的钱。

现在已知共有M个这样的区间,并且给你每个区间花的钱,请问最后,这些树木花了多少药费。

输入

每组输入的第一行有两个整数N和M。N代表马路的共计多少棵树,M代表区间的数目,N和M之间用一个空格隔开。

接下来的M行每行包含三个不同的整数,用一个空格隔开,表示一个区域的起始点L和终止点R的坐标,以及花费。

输出

输出包含一行,这一行只包含一个整数,所有的花费。

解析

1.利用b[i]=a[i]-a[i-1]差分式。这里由于开始时都是0,可以用,但是用完都还是0,所以没有意义,直接跳过就可以。

2.依次读入区间的值,然后将对于区间的操作转化为对于区间端点操作加减。所以数目整体区间要右移一位。对于每个[l,r]区间的加减操作都转化为对端点l,r+1的操作。

3.差分还原。

#include<bits/stdc++.h>
using namespace std;
int b[100005],a[100005];
int main(){int n,m;cin>>n>>m;for(int i=1;i<=n;i++){b[i]=a[i]-a[i-1];}while(m--){int l,r,value;cin>>l>>r>>value;l+=1;r+=1;b[l]+=value;b[r+1]-=value;}long long sum=0;for(int i=1;i<=n;i++){a[i]=b[i]+a[i-1];sum+=a[i];}cout<<sum<<endl;return 0;
}

前缀和

前缀和也是主要用于处理区间问题。

前缀和是指序列的前n项和,可以理解为数学上的数列的前n项和。当对于某一个区间进行多次询问[l,r]的和时,如果正常处理,那么我们每次都要从[l,r],查询N次,那么时间复杂度也是平方阶的。

如果我们使用前缀和,构造一个前缀和数组,通过对端点的值的减法就能O(1)求出[l,r]的和,然后N次查询,时间复杂度就能降到O(N)。

前缀和的特点:

1.将对于区间的求和操作转化为对于端点值的减法的操作。

2.区间求和操作的时间复杂度为O(1).

3.数组存放时从1开始。

4.前缀和数组比原来的数组序列多一个数,第0个。

例题:大学里的树木要维护

题目

教室外有N棵树,根据不同的位置和树种,学校要对其上不同的药。因为树的排列成线性,且非常长,我们可以将它们看作一条直线给他们编号。树的编号从0~N-1且N<1e6。

由于已经维护了多年,每一棵树都由学校的园艺人员进行了维护费用的统计。每棵树的前期维护费用各不相同,但是由于未来需要打药,所以有些树木的维护费用太高的话,就要重新种植。由于维护费用也成区间分布,所以常常需要统计一个区间的树木的维护开销。

现在园艺想知道,某个区间内的树木维护开销是多少,共计M个区间需要查询。

输入

每组输入的第一行有两个整数N和M。N代表马路的共计多少棵树,M代表区间的数目,N和M之间用一个空格隔开。

接下来的一行,包含N个数,每个数之间用一个空格隔开。

接下来的M行,每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点L和终止点R的坐标。

输出

输出包含一行,这一行只包含一个整数,所有的花费。

解析

1.利用sum[i]=a[i]+sum[i-1]前缀和式在输入时求出前缀和。

2.依次读入区间的值,然后将对于区间的操作转化为对于区间端点操作加减。对于每个[l,r]区间的求和操作都转化为对端点[r]-[l-1]的操作。

3.输出答案。

#include<bits/stdc++.h>
using namespace std;
int a[100005],sum[100005];
int main(){int n,m;cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];sum[i]=a[i]+sum[i-1];}while(m>0){m-=1;int l,r;cin>>l>>r;cout<<sum[r]-sum[l-1]<<endl;}return 0;
}

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

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

相关文章

备忘录软件哪款可以加密?备忘录app怎么加密?

在快节奏的现代生活中&#xff0c;备忘录软件已成为我们不可或缺的助手。它不仅能方便我们随时记录任务事项&#xff0c;捕捉生活中的灵感&#xff0c;还便于我们随时修改和查看记录内容&#xff0c;实用性极高。然而&#xff0c;随着记录内容的增多&#xff0c;数据安全性问题…

顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-修改分机注册间隔时间

文章目录 前言联系我们例子问题一问题二 前言 注册周期&#xff1a;SIP客户端会每隔设定的时间发送一次注册请求&#xff0c;freeswitch 如果收到客户端的注册请求&#xff0c;就会让你注册成功&#xff1b;但如果在设定的时间内&#xff0c;freeswitch 任没有收到软件的注册请…

爬虫部署平台crawlab使用说明

Crawlab 是一个基于 Go 语言的分布式网络爬虫管理平台&#xff0c;它支持 Python、Node.js、Jar、EXE 等多种类型的爬虫。 Crawlab 提供了一个可视化的界面&#xff0c;并且可以通过简单的配置来管理和监控爬虫程序。 以下是 Crawlab 的一些主要优点&#xff1a; 集中管理&am…

Netty核心原理剖析与RPC实践11-15

Netty核心原理剖析与RPC实践11-15 11 另起炉灶&#xff1a;Netty 数据传输载体 ByteBuf 详解 在学习编解码章节的过程中&#xff0c;我们看到 Netty 大量使用了自己实现的 ByteBuf 工具类&#xff0c;ByteBuf 是 Netty 的数据容器&#xff0c;所有网络通信中字节流的传输都是…

【2024年IntelliJ IDEA连接redis数据库 】

1&#xff1a;显示 tools window bar&#xff0c;打开database选项 2&#xff1a;添加redis连接信息&#xff1a; 3&#xff1a;填写host主机&#xff0c;端口号&#xff0c;有密码的天上密码&#xff0c;redis没有username&#xff0c;不用填。Test Connection。没问题就Apply…

15 - grace序列处理 - 十三点滑动平均法

grace序列处理 -十三点滑动平均法 滑动平均是一种常用的平滑数据的方法,可以用于去除噪声或者提取趋势。十三点滑动平均是指使用窗口大小为13的滑动平均,应用于GRACE序列处理中可以去除周年项的影响。 十三点滑动平均的计算公式为: y [ n ] = ( x [ n − 6 ]

String、StringBuffer、StringBuilder类

最近在复习 Java 基础的时候&#xff0c;看到了 String 这块的内容&#xff0c;我突发奇想&#xff0c;可以将 String、StringBuffer、StringBuilder 这些知识点整合在一起记忆。我之前背的那个答案其实有点琐碎&#xff0c;而且不太好理解&#xff0c;还繁杂&#xff0c;所以我…

前端缓存揭秘:5年前端技术的必备知识点

背景 本篇文章将详细讲述何为前端缓存&#xff0c;这也是前端工程师必备的知识点。 首先&#xff0c;我们不能少了干这事的目的&#xff0c;前端缓存有什么用&#xff1f; 缓存作用&#xff1a;加快资源获取速度&#xff0c;提高用户体验感&#xff0c;缓解服务端压力 我们带…

用python,将有道词典中的生词导入扇贝单词

我试过有道词典和扇贝单词&#xff0c;个人感觉扇贝单词记忆功能非常好用&#xff0c;但是扇贝单词没有pc版&#xff0c;而有道在这方面就做的很好。博主平时都是用有道查生词&#xff0c;那有没有办法将有道词典中的生词导入扇贝中呢&#xff1f;下面的过程看上去很复杂&#…

Python中的相关规则:注释,参数,模块和包

Python中的相关规则&#xff1a;注释&#xff0c;参数&#xff0c;模块和包 注释参数模块包(package)数据类型其他一些编写代码小技巧 注释 crtl/注释&#xff0c;多行注释&#xff08;三对单引号或双引号&#xff09;&#xff1a;多行注释一般放在文件开头&#xff0c;标明整个…

现在做抖音小店还赚钱吗?真实收益展现!新手不看绝对后悔!

哈喽~我是电商月月 抖音小店&#xff0c;电商这个行业已经走入大众眼前 它确实能赚钱&#xff0c;但经过四五年的时间打磨&#xff0c;部分人心里的顾虑基本都是&#xff1a;现在才开始做抖音小店还赚钱吗&#xff0c;花费大不大 首先&#xff0c;新媒体的时代&#xff0c;现…

YPay源支付V7开源版

YPay_V7版本即将停止维护更新&#xff0c;同时我们将开放最新版开源代码供学习和参考。虽然首批阶段的【function_8.1.php文件是加密的】&#xff0c;但授权已经除去&#xff0c;该代码将在新版YPay上线时开放给大家。我们也会定期进行迭代更新&#xff0c;随后将创建对应仓库&…