前缀和、差分

0x03前缀和、差分

文章目录

  • 0x03前缀和、差分
    • 一维前缀和
    • 二维前缀和
    • 差分
    • 一维差分
    • 二维差分
  • 习题
    • T1
    • T2
    • T3

一维前缀和

数组前n项和

s [ k ] = ∑ i = 1 k a [ i ] s[k]=\sum_{i=1}^ka[i] s[k]=i=1ka[i]

s[i]=s[i-1]+a[i];

二维前缀和

s[i][j]表示以(1,1)为顶点,以(i,j)为右下角的矩形内部权值之和。

即: s [ n ] [ m ] = ∑ i = 1 n ∑ j = 1 m a [ i ] [ j ] s[n][m]=\sum_{i=1}^{n}\sum_{j=1}^ma[i][j] s[n][m]=i=1nj=1ma[i][j]

a[i][j](i,j)点的权值。

那么s[i][j]可以表示为:

s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];

假如我们要求矩阵中 R x R 的矩形的权值和:

ans = s[i+R][j+R]-s[i-1][j+R]-s[i+R][j-1]+s[i-1][j-1];

差分

差分<-------->原数组<------->前缀和

原数组是差分和前缀和的中转站。

一维差分

b[i]=a[i]-a[i-1]

显然,将b[i]累加起来就是a[i]

故有:

∑ i = 1 j b [ i ] = a [ j ] \sum_{i=1}^jb[i]=a[j] i=1jb[i]=a[j]

所以:

for(int i=1;i<=n;i++){b[i]+=b[i-1];
}

累加之后,b[i]就等于a[i].

故,如果我们需要对一个区间进行增减同一个数x的操作

只需要对这个区间的差分数组进行单点修改。

例如,我们需要将[2,5]内的元素全部都增加1

只需要让b[2]+1, b[6]-1 即可。

二维差分

∑ i = 1 n ∑ j = 1 m b [ i ] [ j ] = a [ i ] [ j ] \sum_{i=1}^n\sum_{j=1}^mb[i][j]=a[i][j] i=1nj=1mb[i][j]=a[i][j]

当我们要对一个矩阵中的某一块区域进行加减同一个数x的操作的时候:

例如,将如下这个区间所有元素加上1:

在这里插入图片描述
差分数组:
在这里插入图片描述

其实和一维差分差不多。


习题

T1

99. 激光炸弹 - AcWing题库

普通的二维前缀和,如果为了节省空间的话,可以用前缀和数组和原数组公用一个数组。

#include<bits/stdc++.h>
using namespace std;
const int N = 5000+10;
typedef long long ll;
int sum[N][N] = { 0 };
int main() {ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);int n;int R;cin >> n >> R;R=min(5001,R);R--;memset(sum, 0, sizeof sum);for (int i = 1; i <= n; i++) {int x, y, v;cin >> x >> y >> v;x++;y++;sum[x][y] += v;}for (int i = 1; i <= 5000+1; i++) {for (int j = 1; j <= 5000+1; j++) {sum[i][j] += sum[i - 1][j] + sum[i][j - 1] - sum[i-1][j-1];}}int ans = 0;for (int i = 1; i <= 5000+1; i++) {for (int j = 1; j <= 5000+1; j++) {if(i+R>5001 or j+R>5001)continue;ans = max(ans, sum[i+R][j+R] - sum[i-1][j+R] - sum[i+R][j-1] + sum[i-1][j-1]); }}cout << ans;
}

T2

100. 增减序列 - AcWing题库

差分的经典用途:将某一个区间[l,r]内的数增减同一个数x。

只需要在其差分数组上b[l] 减去1, b[r+1]加上1

所以只对其差分数组中的两个点进行修改。

理论上,如果一个序列中的所有的数是一样的话,那么其差分数组

除第一项以外,其余的都是0.

所以我们只需要修改 b[2]~b[n]中的任意两项,使b[2]~b[n]都为0

计算, b[2]~b[n]中,正数和p、负数和的绝对值q。然后取最小的抵消。此时剩下p-q

进行的操作是min(p,q)

然后剩下的数,与b[1]b[n+1]进行操作。

1、如果b[1]有操作,那么b[1]只可能会被操作 1~p-q次

所以有 p-q种可能

2、如果b[1]无操作,说明p-q次操作都在b[n+1]上,那么有1种情况

总共就是p-q+1 种情况

总操作数:max(p,q)

#include<bits/stdc++.h>
using namespace std;
#define  ios ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr) 
#define lson pos<<1
#define rson (pos<<1)|1
const int N = 1e5+7;
typedef long long ll;
ll a[N];
ll b[N];
int main() {ios;int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++)b[i]=a[i]-a[i-1];ll zsum=0;ll fsum=0;for(int i=2;i<=n;i++){if(b[i]>0)zsum+=b[i];if(b[i]<0)fsum+=b[i];}fsum=-fsum;int ans=max(zsum,fsum);int bns=abs(zsum-fsum);cout<<ans<<endl<<bns+1;}

T3

101. 最高的牛 - AcWing题库

差分的另一种运用,我们一开始假设这些牛一样高,

若 l、r 能互相看见,说明 l、r 之间的数都需要-1

然后最终的答案就是最大身高。

为了减少时间复杂度,我们用差分数组进行单点修改。

将a[l+1]-1, a[r]+1

然后求和,然后每一项+h即可

#include<bits/stdc++.h>
using namespace std;
#define  ios ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr) 
const int N=5e3+7;
typedef long long ll;
map<pair<int,int>,int > mmp;int a[N];
int main() {ios;int n,p,h,m;cin>>n>>p>>h>>m;// for(int i=1;i<=n;i++)a[i]=h;while(m--){int l,r;cin>>l>>r;if(l>r)swap(l,r);if(mmp[pair(l,r)]==0){mmp[pair(l,r)]++;a[l+1]--;a[r]++;}}for(int i=1;i<=n;i++){a[i]+=a[i-1];}for(int i=1;i<=n;i++){a[i]+=h;}for(int i=1;i<=n;i++)cout<<a[i]<<endl;
}

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

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

相关文章

【Python实战】Python多线程批量采集图片

前言 本文来介绍如何多线程采集图片&#xff0c;多线程效率更快&#xff0c;但是&#xff0c;我们单一IP请求过于频繁&#xff0c;可能会被反爬&#xff0c;被封IP&#xff0c;所以&#xff0c;我们就要用到IP代理池&#xff0c;这里&#xff0c;我给大家推荐一个&#xff0c;可…

5.10 动态优先级模式

动态优先级模式与静态优先级模式类似&#xff0c;但动态优先级模式会随着任务运行时条件的改变自动调整任务优先级。调整任务优先级的策略有很多种&#xff0c;最常见的是“最早截止期优先”(Earliest Deadline First)&#xff0c;即优先级最高的任务是离截止时间最近的任务。动…

11个技巧让你的Python性能起飞

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python 是一门非常强大且易于学习的编程语言&#xff0c;但在处理大规模数据或复杂任务时&#xff0c;可能会遇到性能瓶颈。为了让你的 Python 代码运行更快&#xff0c;本文将介绍一些提高 Python 性能的技巧和…

uniapp如何添加多个表单数组?

目录 一、实现思路 二、实现步骤 ①view部分展示 ②JavaScript 内容 ③css中样式展示 三、效果展示 四、小结 注意事项 总结模板&#xff1a; 一、实现思路 1.在 data 中定义一个数组&#xff0c;用于存储表单项的数据 2.在模板中使用 v-for 指令渲染表单项 3.在 methods 中…

如何快速搭建个人博客

说明&#xff1a;本文介绍如何使用Halo框架快速搭建个人博客&#xff0c;我用的是阿里云的云服务器&#xff0c;操作系统是CentOS 7.0。 安装Docker&DockerCompose &#xff08;1&#xff09;Docker安装 Docker的安装参考&#xff0c;Docker安装&卸载&#xff1b; …

AI算力专题:算力系列之四-各省算力规划建设梳理-绿色低碳高质量发展-部署算力建设AI产业研究

今天分享的是AI算力系列深度研究报告&#xff1a;《AI算力专题&#xff1a;算力系列之四-各省算力规划建设梳理-绿色低碳高质量发展-部署算力建设AI产业研究》。 &#xff08;报告出品方&#xff1a;中泰证券&#xff09; 报告共计&#xff1a;40页 数据中心能耗情况 随着越…

【Docker】linux、nginx、容器镜像三者基本概念

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

PCB设计10条重要布线原则(学习笔记)

文章目录 一、连线精简二、避免走直角线三、差分走线四、蛇形走线五、圆滑走线六、数字与模拟分开七、3W原则八、20H原则九、铜箔承载电流十、过孔承载电流 一、连线精简 尽量用最短的路径去布线 1、可以省资源 2、信号差损少 3、线能不拐弯就不拐弯 4、能不换层就不换层 二…

SQL中实现行列转换

目录 方法一&#xff1a;sum case when 方法二&#xff1a;sum if 方法三&#xff1a;pivot 现在有一张表class_gender&#xff0c;内容如下&#xff1a; classgender一年级女一年级女一年级男一年级男二年级女二年级女二年级男 现在我们要根据上表&#xff0c;统计得到下…

初识attention

近年来&#xff0c;attention机制在机器视觉和机器翻译领域受到了广泛的关注&#xff0c;有很多文章都是融合attention来提高性能。attention受启发于人类的视觉系统&#xff0c;最先应用于序列化的机器翻译(NLP)后又推广到计算机视觉中&#xff0c;本篇文章就来简单学习一下at…

JS基础 - 遍历对象方法(6种)

初始值&#xff1a; var obj {a: 1,b: 2,c: 3,d: 4,e: 5,}; 第一种&#xff1a;for in for (let key in obj) {console.log(key ":" obj[key]);} 第二种&#xff1a;Object.keys 获取key Object.keys(obj).forEach((key) > {console.log(key ":" …

AI绘画:PhotoMaker Win11本地安装记录!

昨天介绍一个叫PhotoMaker的AI绘画开源项目。挺不错的&#xff01; 通过这个项目可以快速制作特定人脸的AI绘画作品&#xff0c;相比传统的技术效果会好很多&#xff0c;效率也高很多。 今天趁热打铁&#xff0c;本地电脑装装看&#xff0c;并且记录&#xff0c;分享一下&#…

js padEnd方法介绍笔记

padEnd() 是 JavaScript 字符串的方法之一&#xff0c;它用于在当前字符串的末尾添加指定数量的字符&#xff0c;直到字符串达到指定的长度。 padEnd() 方法接受两个参数&#xff1a; 目标长度和要添加的填充字符。 如果当前字符串的长度已经等于或超过目标长度&#xff0c;则不…

程序员怎么写简历_写简历软件

你们在制作简历时&#xff0c;是不是基本只关注两件事&#xff1a;简历模板&#xff0c;还有基本信息的填写。 当你再次坐下来更新你的简历时&#xff0c;可能会发现自己不自觉地选择了那个“看起来最好看的模板”&#xff0c;填写基本信息&#xff0c;却没有深入思考如何使简历…

vue预览pdf文件的几种方法

文章目录 vue预览pdf集中方法方法一&#xff1a;方法二&#xff1a;展示效果&#xff1a;需要包依赖&#xff1a;代码&#xff1a; 方法三&#xff1a;展示效果&#xff1a;需要包依赖&#xff1a;代码&#xff1a;自己调参数&#xff0c;选择符合自己的 vue预览pdf集中方法 我…

第 9 章:理解C++内存模型

本章是继[第8章]讨论的延续&#xff0c;我们在那里讨论了一些多进程和多线程技术&#xff1b;本章将增强它们的使用。我们将引导你了解各种技术&#xff0c;同时聚焦于本章的主要内容——C内存模型。但为了讨论这一点&#xff0c;你首先将简要检视通过智能指针和可选对象实现的…

ZK鉴权设计以及相关探讨

文章目录 1. zk的鉴权设计2. zk鉴权应用范围3. zk鉴权的常用方法4. 推荐配置5. 参考文档 鉴权&#xff0c;分别由鉴和权组成 鉴&#xff1a; 表示身份认证&#xff0c;认证相关用户是否存在以及相关的用户名和密码是否一致权&#xff1a; 完成身份的鉴后&#xff0c;还需要判断…

DolphinScheduler + Amazon EMR Serverless 的集成实践

01 背景 Apache DolphinScheduler 是一个分布式的可视化 DAG 工作流任务调度开源系统&#xff0c;具有简单易用、高可靠、高扩展性、⽀持丰富的使用场景、提供多租户模式等特性。适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方…

【C++】std::variant

上一篇文章讲到了 union&#xff0c;union union存在很多问题&#xff0c;因此C17设计了一个新的variant替代原来的union。 union的问题 无法知道当前使用的类型是什么。而且union无法自动调用底层数据成员的析构函数。 这些使得一般只对一些“基本类型”使用union&#xf…

Redis 安装 redistimeseries.so(时间序列数据类型)教程

配置步骤 1.下载 redistimeseries.so 文件 2.在 redis.conf 中增加配置 loadmodule /home/chenjian/redis-lib/RedisTimeSeries/redistimeseries.so DUPLICATE_POLICY LAST3.重启 Redis 服务 4.连接客户端&#xff0c;测试 RedisTimeSeries 相关命令&#xff0c;下图表明 R…