首页 > 其他分享 >一维差分模板

一维差分模板

时间:2024-10-30 23:32:10浏览次数:4  
标签:数组 int 整数 差分 一维 序列 模板 1000

一维差分模板

题目描述:

输入一个长度为 n的整数序列。

接下来输入 m 个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r]之间的每个数加上 c。

请你输出进行完所有操作后的序列。

输入格式:

第一行包含两个整数 n 和 m。

第二行包含 n 个整数,表示整数序列。

接下来 m 行,每行包含三个整数 l,r,c,表示一个操作。

输出格式:

共一行,包含 n 个整数,表示最终序列。

数据范围:

1≤n,m≤100000
1≤l≤r≤n
−1000≤c≤1000
−1000≤整数序列中元素的值≤1000

输入样例:

6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1

输出样例:

3 4 5 3 4 2

差分,可以看作对前缀和的逆运算,差分和前缀和类似于求导和积分的关系

首先我们有一个数组,a[0],a[1]........a[n-1],a[n]

然后我们可以构建另一个数组,b[0],b[1].........b[n-1],b[n]

将a数组看作是b数组的前缀和数组,也就是:a[i]=b[0]+......+b[i-1]+b[i]。

那么b数组就是a数组的差分数组。

如图所示:

image

知道了差分数组有什么用呢?让我们往后看。

回到题目,题目要求我们在区间[l,r]内的每个数都加上c,询问m次,我们正常的暴力做法是:

for(int i=l;i<=r;i++)
{
     a[i]+=c;
}

这个时间复杂度是O(n)的,但是我们可以用差分将这个时间复杂度优化到O(1).

我们要想到一点,a数组是b数组的前缀和数组,也就是对b数组的操作,会同样的影响到a数组。

首先,我们可以先让b[l]+c..........b[r]+c,

这样就给[l,r]内的数加上了c,

然后还没有结束,

我们还需要,b[r+1]-c..........b[n]-c

为什么要这样呢?

我们可以画图理解:

image

如果我们给b[l]+c,那么从l到n内的所有数都会+c,那我们该怎么做呢?

那我们只要给R+1到n内的所有数再减上c不就行了吗?

于是我们就得到了一维差分的核心代码:

b[l]+=c;
b[r+1]-=c;

完整代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N],b[N];  //a是原数组,b是差分数组 
int n,m;
  //差分操作 
void insert(int l,int r,int c)
{
	b[l]+=c;
	b[r+1]-=c;
}
int main()
{
	scanf("%d%d",&n,&m);
	
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	
	for(int i=1;i<=n;i++) insert(i,i,a[i]);     //构建差分数组 
	
	
	//询问 
	while(m--)
	{
		int l,r,c;
		scanf("%d%d%d",&l,&r,&c);
		insert(l,r,c);  //[l,r]对每个数进行加c操作
		               //O(1)的时间复杂度 
	}
	 
	 //将b数组还原为a数组 
	for(int i=1;i<=n;i++) a[i]=a[i-1]+b[i];
	
	for(int i=1;i<=n;i++) printf("%d ",a[i]);
	
	return 0;
 } 

标签:数组,int,整数,差分,一维,序列,模板,1000
From: https://www.cnblogs.com/xie-blog/p/18516823

相关文章

  • 二维前缀和模板
    二维前缀和模板题目描述:输入一个n行m列的整数矩阵,再输入q个询问,每个询问包含四个整数x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。对于每个询问输出子矩阵中所有数的和。输入格式:第一行包含三个整数n,m,q接下来n行,每行包含m个整数,表示整数矩阵。接下来......
  • 基于STL的自定义栈与队列实现:灵活选择底层容器的模板设计
    文章目录代码模板设计主要成员函数底层容器的选择模板设计底层容器的选择关于stack的示例代码关于queue的示例代码前言:在本文中,我们将分析一个模拟C++标准模板库(STL)栈的自定义实现以及模仿C++标准模板库(STL)队列的自定义实现。该stack类模板允许在底层容器的选择......
  • 详解:模板设计模式
            模板设计模式(TemplatePattern)是一种行为设计模式,在软件设计中有着广泛的应用,旨在提高代码的可维护性和可复用性。一、定义与特点定义:模板设计模式定义了一个算法的骨架,将某些步骤推迟到子类中实现。这样,可以在不改变算法结构的情况下,重新定义算法中的某些......
  • Windows Server 2022 OVF, updated Oct 2024 (sysin) - VMware 虚拟机模板
    WindowsServer2022OVF,updatedOct2024(sysin)-VMware虚拟机模板2024年10月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:https://sysin.org/blog/windows-server-2022-ovf/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org现......
  • Windows Server 2019 OVF, updated Oct 2024 (sysin) - VMware 虚拟机模板
    WindowsServer2019OVF,updatedOct2024(sysin)-VMware虚拟机模板2024年10月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:https://sysin.org/blog/windows-server-2019-ovf/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgWin......
  • Windows Server 2016 OVF, updated Oct 2024 (sysin) - VMware 虚拟机模板
    WindowsServer2016OVF,updatedOct2024(sysin)-VMware虚拟机模板2024年10月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:https://sysin.org/blog/windows-server-2016-ovf/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org现......
  • Windows Server 2008 R2 OVF, updated Aug 2024 (sysin) - VMware 虚拟机模板
    WindowsServer2008R2OVF,updatedAug2024(sysin)-VMware虚拟机模板WindowsServer2008R2简体中文版OVF,2024年10月更新请访问原文链接:https://sysin.org/blog/windows-server-2008-r2-ovf/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgWindows......
  • PbootCMS 模板提示未检测到您服务器环境的sqlite3数据库扩展
    错误信息:未检测到您服务器环境的sqlite3数据库扩展,请检查php.ini中是否已经开启该扩展!另外,检测到您服务器支持pdo_sqlite扩展,您也可以修改数据库配置连接驱动为pdo_sqlite试试!解决方法:1.**第一种方法**:把数据库配置连接驱动改为pdo_sqlite-打开数据库配置文件`/apps/co......
  • 帝国CMS中打印模板制作教程详解
    调用打印页面链接:模板中添加打印页面链接:[!--news.url--]e/DoPrint/?classid=[!--classid--]&id=[!--id--]指定使用打印模板的链接:[!--news.url--]e/DoPrint/?classid=[!--classid--]&id=[!--id--]&tempid=打印模板ID管理打印模板:登录后台,选择“模板......
  • 差分与等差数列问题
    利用差分的思想解决多次对数组区间加相同数,或者加一个等差数列最好思路:从目标数列往前推两次前缀和,反推差分数组应该怎么加  #include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,m,l,r,s,e,d,maxv,ans;inta[10000005],sum[10000005];sig......