差分与前缀和

news2024/11/27 14:26:58

目录

差分法

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

前缀和

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

差分法

差分法的应用主要是用于处理区间问题,当一个数组要在很多不确定的区间,加上相同的一个数,我们如果每个数都进行加法操作的话,那么复杂度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]+=value
    b[r+1]-=value
    区间减法改为:
    b[l]-=value
    b[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.coloradmin.cn/o/1562863.html

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

相关文章

数据结构01 线性表

#include<stdio.h>/* 如果没有使用&符 void test(int x){ */ void test(int & x){x 1024;printf("test函数内部 x %d\n", x);} int main(){int x 1;printf("调用test前 x %d\n", x);test(x);printf("调用test后 x %d\n", …

4.机器学习-十大算法之一线性回归算法(LinearRegression)案例讲解

机器学习-十大算法之一线性回归算法案例讲解 一摘要二个人简介三什么是线性回归四LinearRegression使用方法五糖尿病数据线性回归预测1.数据说明2.导包3.导入数据4.脱敏处理5.抽取训练数据和预测数据6.创建模型7.预测8.线性回归评估指标9.研究每个特征和标记结果之间的关系.来分…

网络体系结构概述

目录 1. OSI/RM参考模型1.1. 物理层1.2. 数据链路层1.3. 网络层1.4. 传输层1.5. 会话层1.6. 表示层1.7. 应用层 2. TCP/IP参考模型3. 理解OSI七层模型 网络体系结构是线代网络技术的整体蓝图。 1. OSI/RM参考模型 开放互联参考模型&#xff08;Open System Interconnection/…

CH347

动态库封装实例 import ctypes# Load the CH347DLL library ch347dll ctypes.WinDLL(CH347DLLA64.dll) # Update the filename if necessary# Define the argument and return types for CH347OpenDevice ch347dll.CH347OpenDevice.argtypes [ctypes.c_ulong] ch347dll.CH3…

Selinux安全策略文件

在Selinux框架中&#xff0c;安全策略都是写在te文件中&#xff0c;以adb.te 文件为例 allow adbd shell_data_file:dir create_dir_perms;策略的基本格式是&#xff1a; rule_name source_type target_type :object_class perm_setrule_name 规则名。常见的规则名有allow,ne…

无问芯穹 MaaS AI 平台公测免费试用笔记:一

本篇文章聊聊正在公开测试的平台&#xff0c;无问芯穹的 MaaS 服务&#xff0c;包含了平台使用体验和一些小技巧。 因为测试给的免费卡时比较少&#xff0c;估计想完成完整测试或许需要一些时间&#xff0c;额外用一些账号进行。就先记录下常规折腾过程吧&#xff0c;让再次“…

element-ui message 组件源码分享

今日简单分享 message 组件的源码&#xff0c;主要从以下四个方面来分享&#xff1a; 1、message 组件的页面结构 2、message 组件的 options 配置 3、mesage 组件的方法 4、个人总结 一、message 组件的页面结构 二、message 组件的 options 配置 前置说明&#xff1a;m…

Centos7 安装 Oracle19c

下载oracle预安装包 wget http://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm 下载19c安装包 https://www.oracle.com/cn/database/technologies/oracle-database-software-downloads.html#19c 选择…

OpenLayers6实战,OpenLayers实现鼠标拖拽绘制三角形,OpenLayers自定义绘制特殊图形

专栏目录: OpenLayers实战进阶专栏目录 前言 本章讲解使用OpenLayers如何绘制三角形。 OpenLayers本身是可以通过多边形绘制来绘制自行绘制三角形的,但是这种绘制方式是通过鼠标点击每个点来实现线条链接的,不支持固定的三角形这种特殊图形绘制的。 因此本章我们通过自定义…

Express.js项目实战(1)—— 我的藏书馆

首先新建文件夹——myLibrary 在vscode中点击文件>点击 Duplicate Workspace(以工作区的方式打开文件夹myLibrary) 点击duplicate Workspace&#xff08;打开工作区&#xff09; 之后&#xff0c;会出现以下界面 点击打开文件夹&#xff0c;选择新建的文件夹&#xff0c;会出…

服务器托管让服务器管理更轻松高效

在信息化飞速发展的今天&#xff0c;服务器作为企业数据处理和信息存储的核心设备&#xff0c;其管理的重要性日益凸显。服务器托管&#xff0c;作为一种高效、专业的服务器管理方式&#xff0c;正逐渐成为众多企业的首选。那么&#xff0c;服务器托管究竟是如何让服务器管理更…

GEE:基于光谱距离方法的变化检测(以滑坡为例)

作者:CSDN @ _养乐多_ 本文将介绍在 Google Earth Engine(GEE)平台上,使用光谱向量距离度量方法进行变化检测的代码。代码中使用哨兵数据的光谱向量,并以检测滑坡为例进行演示。 结果如下图所示, 文章目录 一、参考内容1.1 光谱距离1.2 点积二、代码链接三、完整代码一…

Linux中查看文件内容的命令

文章目录 一、七类常见的Linux的文件二、显示命令三、分页显示四、显示文件前后内容五、压缩、解压缩六、补充 一、七类常见的Linux的文件 字符文件类型-普通文件&#xff0c;包括纯文本文件、二进制文件、各种压缩文件等。在find命令中&#xff0c;type 选项中用 f来表示d目录…

GoogleNet神经网络介绍

一、简介 GoogleNet&#xff0c;也称为GoogLeNet&#xff0c;是谷歌工程师设计的一种深度神经网络结构&#xff0c;它在2014年的ImageNet图像识别挑战赛中取得了冠军。该神经网络的设计特点主要体现在其深度和宽度上&#xff0c;通过引入名为Inception的核心子网络结构&#x…

【Jmeter+Influxdb+Grafana性能监控平台安装与部署】

JmeterInfluxdbGrafana性能监控平台安装与部署 前言Influxdb安装与连接Jmeternfluxdb下载&#xff08;winodws&#xff09;Grafana安装与配置 前言 我们在性能测试过程中&#xff0c;在需要较大并发时&#xff0c;为了尽量避免使用GUI界面来节省资源&#xff0c;通常使用命令行…

SAP-怎么查一个帐号访问事务代码的记录或者一个事务代码的被访问记录

起因 上周六&#xff0c;查了某用户对某事务代码的访问记录。今天又要查类似的信息。我发现我居然忘了该怎么查了。于是在处理完事情之后&#xff0c;整理了查询的过程&#xff0c;形成了这篇文章。 经过 热心网友告诉了我一个事务代码&#xff1a;ST03N - 工作负载和性能统…

[Python学习篇] Python解释器

解释器的作用 Python解释器&#xff08;Interpreter&#xff09;的作用&#xff0c;通俗理解&#xff0c;就是起到一个翻译的作用&#xff0c;把程序员所编写的代码翻译为计算机能读懂执行的代码。简单地说&#xff0c;Python解释器对输入的Python代码进行解释和执行。Python解…

强!10.6K star,一款开源HTTP测试工具,适合新手,简单、容易上手!

大家好&#xff0c;我是狂师&#xff01; 今天给大家推荐一款开源的HTTP测试工具&#xff1a;Hurl&#xff0c;相比curl、wget功能更强大&#xff0c;且更容易上手、很适用新手使用。 1、项目介绍 Hurl是一个使用Rust语言开发的命令行工具&#xff0c;它允许用户运行以简单纯…

EasyExcel 复杂表头的导出(动态表头和静态表头)

问题&#xff1a;如图&#xff0c;1部分的表头是动态的根据日期变化&#xff0c;2部分是数据库对应的字段&#xff0c;静态不变的&#xff1b; 解决方案&#xff1a;如果不看1的部分&#xff0c;2部分内容可以根据实体类注解的方式导出&#xff0c;那么我们是不是可以先将动态表…

linux内核网络分析-通用字段“每日读书”

这一节讨论sk_buff的主要字段&#xff0c;而这些字段都与特定的内核功能无关。 struct timeval stamp; 通常只对一个已经接收的封包才有意义&#xff0c;这是一个时间戳&#xff0c;用于避哦啊是封包何时被接收&#xff0c;或者有时候用于表示封包预定传输的时间&#xff0c;此…