【算法】差分

news2024/11/24 3:18:06

作者:指针不指南吗
专栏:算法篇

🐾合理规划时间与精力🐾

1.什么是差分?

与前缀和是反函数

原数组a

a1 , a2 , a3 , a4 , a5 , a6 , a7

构造数组b

a1=b1;

a2=b1+b2;

a3=b1+b2+b3;

ai=b1+b2+b3+…+bi;

构造一个b数组使得,他的前缀和是 a;

则b就是a的差分。


2.怎么求差分?

差分b , 前缀和 a;

  • 第一种
for(int i=1;i<=n;i++){
	cin>>a[i];
	b[i]=a[i]-a[i-1];
}
  • 第二种 利用函数,在问题具体操作时保持一致
void insert(int l,int r,int c)
{
	b[l]+=c;
    b[r+1]-=c;
}

for(int i=1;i<=n;i++){
	cin>>a[i];
	insert(i,i,a[i]);  //原来 b中都是0,现在插上
}

3.差分有什么用

对一段区间 [ l , r ] 的每个数加上 c,每个数多少

差分 b[ l ] + = c ,则 a[ l ~ n ] 全部都加上 c ,因为a[l]=...+b[l] ,a[l+1]=...+b[l]+b[l+1]

但是注意 r 之后的元素也都加上 c 了,这个不是我们想要的,所以打个补丁 ,令 b[ r + 1 ] - = c ;

优点是:时间复杂度为线性的

#include<iostream>
using namespace std;

const int N=100010;
int a[N],b[N];

int n,m; //n 数组元素个数;m 表示操作次数

void insert(int l,int r,int c){
	b[l]+=c;   //对差分+c
	b[r+1]-=c;  //补丁
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		insert(i,i,a[i]);  //差分b 数组
	}
	
	while(m--){
		int l,r,c;        //对差分 b 操作
		cin>>l>>r>>c;    
		insert(l,r,c);   //对区间进行元素进行操作
	}
	
	for(int i=1;i<=n;i++){    //求出原数组即前缀和a
		a[i]=a[i-1]+b[i];
		cout<<a[i]<<' ';
	}
	
	return 0;
} 

4.进阶: 二维差分

在这里插入图片描述

黄色部分(x1,y1),(x2,y2)内的每个数加上 c

黄色 + c = (红色顶点+c) - (绿色顶点 - c ) - ( 粉色顶点 - c ) + ( 混合 色顶点)

差分处理 :

b [ x1 ] [ y1 ] + = c ;

b [ x1 ] [ y2 - 1 ] - = c ;

b [ x2 ] [ y1 - 1 ] - = c ;

b [ x2 - 1 ] [ y2 - 1 ] + = c ;


  • 代码实现
#include <iostream>

using namespace std;

const int N = 1010;

int n, m, q;
int a[N][N], b[N][N];

void insert(int x1, int y1, int x2, int y2, int c)
{
    b[x1][y1] += c;
    b[x2 + 1][y1] -= c;
    b[x1][y2 + 1] -= c;
    b[x2 + 1][y2 + 1] += c;
}

int main()
{
    scanf("%d%d%d", &n, &m, &q);

    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m; j ++ ){
        	scanf("%d", &a[i][j]);
        	insert(i, j, i, j, a[i][j]);
		}
    
    while (q -- )
    {
        int x1, y1, x2, y2, c;
        cin >> x1 >> y1 >> x2 >> y2 >> c;
        insert(x1, y1, x2, y2, c);
    }

    for (int i = 1; i <= n; i ++ ){
    	for (int j = 1; j <= m; j ++ ){
        	b[i][j] += b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1];
        	printf("%d ", b[i][j]);
		}
    	puts(" ");
	}
	
	return 0;
}

Alt

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

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

相关文章

【Linux】信号量

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…

Java基础:面向对象进阶

1.static 1.static概念 工具类 2.static内存图 静态变量是随着类的加载而加载的,优于对象出现 3.static的注意事项 1.静态方法中,只能访问静态 : 因为非静态方法一般会传入调用方法的对象的地址this(一般是虚拟机自动调用,不需要手动传入, 如student.study()).但是由于静态方…

MapStruct使用指北

mapstruct官方文档链接&#xff0c;点击跳转 mapstruct是什么&#xff1f; MapStruct 是一个代码生成器&#xff0c;它基于约定优于配置方法极大地简化了 Java bean 类型之间映射的实现。 生成的映射代码使用简单的方法调用&#xff0c;因此速度快、类型安全且易于理解。 为…

介绍一款HCIA、HCIP、HCIE的刷题软件

华为认证考试分为三个等级&#xff0c;分别为工程师HCIA、高级工程师HCIP、专家HCIE&#xff0c;等级越高&#xff0c;考试难度越大。 本篇带大家详细了解华为数通题库刷题工具的详细操作步骤。 操作须知&#xff1a;本款刷题工具为一款刷题小程序&#xff0c;无需安装即可在线…

vue2源码之生命周期篇

vue2源码之生命周期篇vue2源码之生命周期篇生命周期流程图初始化阶段&#xff08;new Vue&#xff09;vue2源码之生命周期篇 生命周期流程图 从图中可以看到&#xff0c;Vue实例的生命周期大致可分为4个阶段&#xff1a; 初始化阶段&#xff1a;为Vue实例上初始化一些属性&am…

YOLOv8 目标检测 | 自定义数据集

本文介绍了使用用于目标检测的自定义数据训练 YOLOv8 模型。我正在使用来自 kaggle 的 yolo 格式的“Face Mask Dataset”&#xff0c;数据集链接如下&#xff1a;https://www.kaggle.com/datasets/maalialharbi/face-mask-dataset?resourcedownloadYOLOv8 是目前最先进的 YOL…

一【 mybatis的工作流程】

目录一.mybatis执行流程二.使用工具类简化项目&#xff08;反射的体现&#xff09;2.1 Sqlsession工厂对像2.2 工具类&#xff08;可直接放在工具类使用&#xff09;一.mybatis执行流程 1.1 读取主配置文件mybatis-config.xml&#xff0c;获得运行环境和数据库连接。 1.2 加载映…

35.网络结构与模型压缩、加速-2

35.1 Depthwise separable convolution Depthwise separable convolution是由depthwise conv和pointwise conv构成depthwise conv(DW)有效减少参数数量并提升运算速度 但是由于每个feature map只被一个卷积核卷积,因此经过DW输出的feature map不能只包含输入特征图的全部信息,…

【C/C++基础练习题】复习题三

C复习题知识点记录&#xff1a; 在定义结构体类型时&#xff0c;不可以为成员设置默认值。 在公用一个共用体变量时。系统为其分配存储空间的原则是按成员中占内存空间最大者分配 a ,La, "a", L"a" 字符 长字符 字符串 长字符串 布尔类型只有两个值 fal…

蓝桥杯C/C++VIP试题每日一练之2n皇后问题

💛作者主页:静Yu 🧡简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者 💛社区地址:前端知识交流社区 🧡博主的个人博客:静Yu的个人博客 🧡博主的个人笔记本:前端面试题 个人笔记本只记录前端领域的面试题目,项目总结,面试技…

C语言(文件,流,键盘输入和输出以及文件结尾)

目录 一.文件 二.流 三.输入和输出 二.文件结尾 一.检测方法 二.不同的操作系统&#xff0c;文件结束方式 3.使用scanf检测EOF 一.文件 文件&#xff08;file&#xff09;是存储器中存储信息的区域。通常&#xff0c;文件都保存在某种永久存储器中。文件对于计算机系统相当重要…

【C++之容器适配器】栈和队列模拟实现

目录前言一、栈(stack)1. 基本代码结构2. 简介3. 成员类型4. 成员函数1. 构造函数2. empty()3. size()4. top()5. push()6.pop()7. 综合测试实现的stack的所有函数接口二、队列(queue)1. 基本代码结构2. 队列的简介3. 成员类型4. 成员函数1. 构造函数2. empty()3. size()4. fro…

leaflet 上传KML文件,导出geojson文件(065)

第065个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中本地上传kml文件,利用解析此kml文件,在地图上显示图形。点击导出geojson,将下载为geojson文件。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代…

ChatGPT 怎么用最新详细教程-新手小白一看就会

ChatGPT 以其强大的信息整合和对话能力惊艳了全球&#xff0c;在自然语言处理上面表现出了惊人的能力。这么强大的工具我们都想体验一下&#xff0c;那么 ChatGPT 怎么用呢&#xff1f;本文将给你逐步详细介绍。使用 ChatGPT 主要有4步&#xff1a;注册 ChatGPT 账号通过短信接…

vue 开发环境 卸载node 版本 切换新的 node 版本 mac电脑

注意&#xff1a;操作的机器当前是mac&#xff0c;先卸载&#xff0c;再安装 1.查看现有 node 版本 node -v2.卸载现有 node 版本&#xff0c; 1.卸载从node官网下载pkg安装的node sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node…

地址空间 (Address Space)

文章目录&#xff1a;程序地址空间进程地址空间程序地址空间 什么是地址空间&#xff1a;地址空间是内存中可供程序或进程使用的有效地址的范围。也就是说&#xff0c;它是程序或进程可以访问的内存。内存可以是物理的、也可以是虚拟的&#xff0c;用于执行指令和存储数据。 …

nginx开启Gzip压缩,Vue性能优化之使用gzip压缩打包

一、前言不管是vue项目还是react项目在使用webpack打包之后都会生成一个动辄一两兆甚至更大的js文件&#xff0c;在某些情况下严重影响项目性能&#xff0c;打开页面的时候白屏时间会很长&#xff0c;本文将介绍如何使用gzip压缩打包&#xff0c;主要是nginx部署的配置&#xf…

hadoop环境新手安装教程

1、资源准备&#xff1a; &#xff08;1&#xff09;jdk安装包&#xff1a;我的是1.8.0_202 &#xff08;2&#xff09;hadoop安装包&#xff1a;我的是hadoop-3.3.1 注意这里不要下载成下面这个安装包了&#xff0c;我就一开始下载错了 错误示例&#xff1a; 2、主机网络相…

天荒地老修仙功-第六部:Spring Cloud中7中负载均衡策略

文章目录前言Ribbon介绍负载均衡设置七种负载均衡策略1、轮询策略2、权重策略3、随机策略4、最小链接数策略5、重试策略6、可用性敏感策略7、区域敏感策略总结前言 负载均衡器通常有两种实现手段&#xff0c;一种是服务端负载均衡器&#xff0c;另一种是客户端负载均衡器&…

线程池的常见知识点总结

文章目录1. 什么是线程池2. 为什么使用线程池3. 线程的作用4. 如何创建线程池5. 线程持底层是如何实现复用的6. 手写一个简易的线程池7. ThreadPoolExecutor构造函数原理8. 线程池创建的线程会一直运行下去吗&#xff1f;9. 线程池队列满了任务会丢失吗&#xff1f;分析情况有界…