一维前缀和/差分,二维前缀和/差分

纯纯笔记,不详细不详细

代码不是题解不全是题解(是题解的能ac)

一维:

前缀和:

预处理,算出从1到 i 所有数的总和

使用场景:

在查询某一区间,如:查询 arr数组中 从 下标left 到 下标 right 的 的所有数值之和

1.如果不使用前缀和,暴力循环,时间复杂度为 o(1)(遍历数组,从left遍历到right),这样有很多次重复计算。

2.如果使用前缀和,查询时时间复杂度为 o(1),即一次查询就算出了要求区间内的数值总和,

查询时 sum[right]-sum[left-1] 

#include <iostream>
using namespace std;
int sum[1000005];
int arr[1000005];//可以不创建arr数组,因为arr[i]每个位置的数字都只用了一次->用于计算sum[i]
int main()
{   int n = 0, a = 0;cin >> n;for(int i = 1; i <= n; i++){cin>>arr[i];sum[i] = sum [i-1] + arr[i];}cin >> left >> right;cout << sum[right] - sum[left-1];return 0;
}

一维差分练习:

洛谷P8218

差分:

前缀和的逆运算

使用场景:

(假设仍有 arr[100005] 数组)

差分用于同时对 (arr[1000005] )数组某一区间的数值进行操作,而不必暴力循环

例如:对arr[x]到arr[y]同时加上某一数值z

1.构建差分数组

构建arr[]的差分数组brr[]

brr[i]=arr[i]-arr[i-1](i从1开始,arr[0]=0=brr[0])

brr[1]~brr[i]的 前缀和 等于 arr[i],例如:

        arr[1]=brr[1](+brr[0],brr[0]=0)

        arr[2]=brr[2]+brr[1] ~~~~~ = brr[2]+arr[1]

        arr[3]=brr[3]+brr[2]+brr[1] ~~~~~ brr[3]+arr[2]

        ......

        arr[i]=brr[i]+arr[i-1]

2.原理

假设要对arr数组的 [l,r] 区间内所有值同时加上z,

1>首先,对brr[l]+z

这时如果 再使用brr[1]~brr[i]求前缀和,得新的arr[]数组

这等效于对arr[l]~arr[i]所有数值都加z

但现在不求brr的前缀和

2>然后,对brr[r+1]-z

这等效于对arr[r+1]~arr[i]所有数值减z

这时如果 再使用brr[1]~brr[i]求前缀和,得新的arr[]数组

这等效于对arr[l]~arr[i]所有数值都加z

现在对求brr的前缀和,得到的结果的就是对arr[l,r]区间内所有值+z的结果

#include <iostream>
using namespace std;
int main()
{int n = 0, p = 0, i = 0, j = 0;int x = 0, y = 0, z = 0;cin >> n >> p;for (i = 1; i <= n; i++){cin >> arr[i];brr[i] = arr[i] - arr[i - 1];}cin >> x >> y >> z;brr[x] += z;brr[y + 1] -= z;for (i = 1; i <= n; i++) {arr[i] = brr[i] + arr[i - 1];}return 0;
}

一维差分练习

洛谷P2367 语文成绩

二维:

二维稍微复杂一些,配图片更容易理解,但是这里大概率没有(

前缀和:

定义数组arr[][],sum[][]

arr[][]储存输入数据

sum[][]储存arr[][]前缀和

sum[i][j]的意义是左上角为arr[1][1]~右下角为arr[i][j]的矩形区间内数值的前缀和

使用场景:

多次对某一个二维区间内数值求和(仅进行一次求和操作,之后只进行查询操作)

递推sum公式:

把左上角为arr[1][1]~右下角为arr[i][j]的矩形区间分为四个小矩形区间

(便于理解,不对arr数组真的操作)

                区间1>arr[1][1]~右下角为arr[i][j-1]

                区间2>arr[1][1]~右下角为arr[i-1][j]

                区间3>arr[1][1]~右下角为arr[i-1][j-1]

                区间4>arr[i][j]~右下角为arr[i][j],其实就是arr[i][j]

        最大矩形的前缀和=(区间1.左+区间2.上-区间3.左上)前缀和 + 区间4.右下角单个arr[i][j]数值

        sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+arr[i][j]

#include <iostream>
using namespace std;
int arr[121][121];
int sum[121][121];
int main()
{int n = 0, i = 0, j = 0, x = 0, y = 0;int max = -0x7f7f7f, t = 0;cin >> n;for (i = 1; i <= n; i++)for (j = 1; j <= n; j++){cin >> arr[i][j];sum[i][j]+= sum[i - 1][j]+ sum[i][j - 1]- sum[i - 1][j - 1]+ arr[i][j];}for (i = 1; i <= n; i++)for (j = 1; j <= n; j++)for (x = i; x <= n; x++)for (y = j; y <= n; y++){t = sum[x][y]- sum[x][j - 1]- sum[i - 1][y]+ sum[i - 1][j - 1];if (max < t)max = t;}cout << max;return 0;
}

二维前缀和练习:

洛谷P1719最大加权矩阵

差分:

二维前缀和的逆运算

使用场景:

对二维区间内某一数值进行批量操作

初始化差分数组不太方便,可以假想在一个 全0的二维矩阵(设为crr[][]) 上操作,最后将变换后的crr[][]与原arr[][]做矩阵加法

二维差分数组与一维差分数组的相似之处:

(定义原数组arr[N][N],差分数组brr[N][N]])

对二维差分数组操作时,假设对brr[i][j]+z,等同于对arr[i][j]~arr[N][N]所有数+z

使用场景,具体操作:

对某一区间(如左上角arr[i][j]~右下角arr[x][y])内数据全部+z

1>(便于理解,不真的对arr数组进行操作)

把左上角arr[i][j]~右下角arr[N][N]大矩形区间分为四个小矩形区间

                区间1>arr[i][j]~右下角为arr[x][y]

                区间2>arr[i][y+1]~右下角为arr[N][N]

                区间3>arr[x+1][j]~右下角为arr[N][N]

                区间4>arr[x+1][y+1]~右下角为arr[N][N]

        直接对全零矩阵进行操作,不考虑初始化br人, 现在brr也是全0矩阵

(可以认为brr是全零矩阵的差分数组)

        brr[i][j] += z

        brr[i][y+1] -= z

        brr[x+1][j] -= z

        brr[x+1][y+1] += z

2>对brr求前缀和,即二维数组前缀和,得到将全零矩阵进行变换后的新矩阵

3>新矩阵和原矩阵arr相加

#include<iostream>
using namespace std;
int arr[1005][1005];
int main()
{int m = 0, n = 0;int i = 0, j = 0;int x1 = 0, y1 = 0, x2 = 0, y2 = 0;cin >> n >> m;while (m--){cin >> x1 >> y1 >> x2 >> y2;arr[x1][y1]++;arr[x1][y2 + 1]--;arr[x2 + 1][y1]--;arr[x2 + 1][y2 + 1]++;}for (i = 1; i <= n; i++){for (j = 1; j <= n; j++){arr[i][j] = arr[i][j] + arr[i - 1][j] + arr[i][j - 1] - arr[i - 1][j - 1];cout << arr[i][j] << ' ';}cout << endl;}return 0;
}

二维差分练习:

P3397 地毯

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

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

相关文章

分贝通上线“在线比价”机制,帮助企业在差旅采购中持续获得低价资源

在企业差旅采购中,如何在不断波动的供求关系价格中保持相对价格优势,是企业进行成本管理必须面临的主要挑战之一。差旅平台分贝通通过其“单位降本”产品逻辑,在差旅管理中实现了显著的成本优化效果,帮助3000合作企业在高频支出场景中取得了可持续的低价优势。 差旅平台分贝通…

MySQL 如何用C语言连接

✨✨✨励志成为超级技术宅 ✨✨✨ 本文主要讲解在Linux服务器上&#xff0c;如何使用c语言MySQL库的接口来对MySQL数据库进行操作&#xff0c;如果没有服务器安装MySQL&#xff0c;也可以先学学看怎么用c语言mysql库的接口&#xff0c;还是比较容易的了。(●☌◡☌●)。那么开…

Hadoop生态圈框架部署(六)- HBase完全分布式部署

文章目录 前言一、Hbase完全分布式部署&#xff08;手动部署&#xff09;1. 下载Hbase2. 上传安装包3. 解压HBase安装包4. 配置HBase配置文件4.1 修改hbase-env.sh配置文件4.2 修改hbase-site.xml配置文件4.3 修改regionservers配置文件4.4 删除hbase中slf4j-reload4j-1.7.33.j…

OpenCV与AI深度学习 | 基于YoloV11自定义数据集实现车辆事故检测(有源码,建议收藏!)

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;基于YoloV11自定义数据集实现车辆事故检测 在智能交通系统领域&#xff0c;实时检测车辆事故的能力变得越来越重要。该项目利用先进的计算机视…

Stable Diffusion 秋叶整合包:Deoldify 插件安装不上的处理办法

打开文件 install.py&#xff0c;参见下图&#xff1a; 把 fasiai 的版本号改成 1.0.61 即可。参见下图&#xff1a;

windows下qt5.12.11使用ODBC远程连接mysql数据库

1、下载并安装mysql驱动,下载地址:https://dev.mysql.com/downloads/ 2、配置ODBC数据源,打开64位的ODBC数据源配置工具:

7+纯生信,单细胞识别细胞marker+100种机器学习组合建模,机器学习组合建模取代单独lasso回归势在必行!

影响因子&#xff1a;7.3 研究概述&#xff1a; 皮肤黑色素瘤&#xff08;SKCM&#xff09;是所有皮肤恶性肿瘤中最具侵袭性的类型。本研究从GEO数据库下载单细胞RNA测序&#xff08;scRNA-seq&#xff09;数据集&#xff0c;根据原始研究中定义的细胞标记重新注释各种免疫细胞…

World of Warcraft [WeakAuras]Barney Raid Kit - Collapsing Star Indicator

https://wago.io/BarneyCS 黄色数字表示需要修的血量。 绿色数字表示停止修血。 红色数字表示修血过量&#xff0c;以及该坍缩星将在大爆炸读条结束前多少秒爆炸。 Numbers in yellow means damage required. Numbers in green means HP is good, dont damage anymore. Numbers…

丹摩征文活动 | 0基础带你上手经典目标检测模型 Faster-Rcnn

文章目录 &#x1f34b;1 引言&#x1f34b;2 平台优势&#x1f34b;3 丹摩平台服务器配置教程&#x1f34b;4 实操案例&#xff08; Faster-rcnn 项目&#xff09;&#x1f34b;4.1 文件处理&#x1f34b;4.2 环境配置&#x1f34b;4.3 训练模型&#x1f34b;4.4 数据保存并导…

17.UE5丰富怪物、结构体、数据表、构造函数

2-19 丰富怪物&#xff0c;结构体、数据表格、构造函数_哔哩哔哩_bilibili 目录 1.结构体和数据表格 2.在构造函数中初始化怪物 3.实现怪物是否游荡 1.结构体和数据表格 创建蓝图&#xff1a;结构体蓝图 在结构体蓝图中添加变量&#xff0c;如下所示&#xff0c;为了实现不…

基于SpringBoot+Vue实现剧本杀服务平台【源码+LW+PPT+部署】

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

企业系统集成方案:吉客云与金蝶云星空的无缝对接

企业系统集成方案&#xff1a;吉客云与金蝶云星空的无缝对接 项目背景&#xff1a; 一家领先的3C数码电子产品企业&#xff0c;专注于充电宝、按摩仪等高科技产品的自主研发、设计、生产和销售。企业紧跟市场趋势&#xff0c;积极拓展国内外市场&#xff0c;业务覆盖亚洲、美…

Hi3516CV610 超高清智慧视觉 SoC 产品简介

Hi3516CV610 Hi3516CV610 超高清智慧视觉SoC 内置人脸检测、人形检测、车辆检测、宠物检测、包裹检测算法 总体介绍 Hi3516CV610是一颗应用在安防市场的IPC SoC。在开放操作系统、新一代视频编解码标准、 网络安全和隐私保护、人工智能方面引领行业发 展&#xff0c;主要面…

【短视频内容管理系统的源代码解析与技术交流】

打造短视频矩阵源码&#xff0c;优化细节决胜负 开发和部署短视频矩阵源代码实际上并不复杂。它主要依赖于抖音平台提供的开放权限进行研发&#xff0c;市场上常见的代码功能架构也大同小异。关键在于细节处理和产品优化上的差异。 例如&#xff1a; 1. 在视频制作模块中&…

PH热榜 | 2024-11-12

DevNow 是一个精简的开源技术博客项目模版&#xff0c;支持 Vercel 一键部署&#xff0c;支持评论、搜索等功能&#xff0c;欢迎大家体验。 在线预览 1. Spiky 标语&#xff1a;实时洞察&#xff0c;助力销售决策更快更明智。 介绍&#xff1a;Spiky AI 帮你用实时指导提升团…

C++ 关于基于范围的for循环(C++11) 语法 详解

范围for的语法 在 C98 中如果要遍历一个数组 void TestFor() { int array[] { 1, 2, 3, 4, 5 }; for (int i 0; i < sizeof(array) / sizeof(array[0]); i)array[i] * 2; for (int* p array; p < array sizeof(array)/ sizeof(array[0]); p)cout << *p <<…

【入门篇】判断推理是否有效的实例2——多语言版

跳转原题&#xff1a;判断推理是否有效的实例2 问题分析 根据题目给出的推理逻辑&#xff0c;我们有以下几个条件&#xff1a; 如果张老师来了&#xff08;(P)&#xff09;&#xff0c;问题可以解答&#xff08;(R)&#xff09;&#xff1a;(P \rightarrow R)如果李老师来了&…

5GAP模型:探寻服务质量问题的产生源头

| 91%的消费者表示&#xff0c;他们更有可能在获得卓越的服务体验后再次购买——Salesforce Research 一、什么是5GAP模型&#xff1f; 5GAP模型&#xff0c;指的是服务质量差距模型&#xff08;Service Quality Model&#xff09;&#xff0c;它是由美国营销学家帕拉休拉曼、…

期刊论文查重率多少,才会不被认定为学术不端?

Q问&#xff1a;论文查重和学术不端具有紧密的相关性&#xff0c;但是被认定为学术不端的查重率的界限是什么&#xff1f; A答&#xff1a;关于论文和查重&#xff0c;虽然这两者之间有着“说不清也道不明”的关系&#xff0c;这其中很重要的一个原因是很多人对查重都有一定的…

JAVA中重写与重载的极简区别

重载就是同样的一个方法能够根据输入数据的不同&#xff0c;做出不同的处理重写就是当子类继承自父类的相同方法&#xff0c;输入数据一样&#xff0c;但要做出有别于父类的响应时&#xff0c;你就要覆盖父类方法 方法的重写(Overriding)和重载(Overloading)是java多态性的不同…