前缀和与差分

1.前缀和:

前缀和是指某序列的前n项和

2.一维前缀和:

s[i]=a[1]+a[2]+...+a[i],s[r]-s[l-1]=a[l]+...+a[r]

3.前缀和运算

int sum[N],a[N]
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+a[i];
}

4.查询操作,假设要求序列中第l个数到第r个数的和 ,这样使得查询操作的时间复杂度为O(1)。

sum[r]-sum[l-1]

5.一个模板

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int sum[N], a[N];
int n, m;//n代表序列的长度,m代表询问的次数
int main() {cin >> n >> m;for (int i = 1; i <= n; i++)cin >> a[i];//输入数据for (int i = 1; i <= n; i++)sum[i] = sum[i - 1] + a[i];//前缀和for (int k = 1; k <= m; k++) {int left, right;cin >> left >> right;cout << "区间"<<left<<"到"<<right<<"所有元素和为" << sum[right] - sum[left - 1] << endl;}
}

6.二维前缀和(也可以利用一维的方法)

for (int i = x1; i <= x2; i++) {
    a[i][y1]++;
    a[i][y2 + 1]--;
}

for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
        a[i][j] += a[i][j - 1];
        cout << a[i][j] << " ";
    }

s[i][j]代表第i行第j列左上部分的所有元素之和.

以(x1,y1)为左上角,(x2,y2)为右下角的子矩阵的和为:s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1],希望下面的图能够帮助你理解。

#include<iostream>
using namespace std;
const int N =1000;
int n, m, k;//n代表行数 m代表列数,k代表询问次数
int s[N][N];
int main() {cin >> n >> m>>k;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> s[i][j];}}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];}}cout << endl;while (k--) {int x1, y1, x2, y2;cin >> x1 >> y1 >> x2 >> y2;cout <<'(' << x1 << ',' << y1 << ")到"<<'('<<x2<<','<<y2<<")之间的元素和为:" << s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1] << endl;}return 0;
}

7.差分:求数组中某个区间的元素之和、更新某个区间的元素值等操作,做法:构建一个新的数组,使得新数组的每个元素表示原始数组中相邻元素的差值,这样对差分数组进行一系列操作,可以转换为对原始数组的操作。具体来说,假设有一个原始数组a,长度为n,则差分数组d的长度为n-1,其中d[i]=a[i+1]-a[i]。

8.用途:快速求解数组中某个区间的元素和,高效更新数组中某个区间的元素值..........

9.构造差分数组:

a[0]=0;//a是原数组
b[1]=a[1]-a[0];
b[2]=a[2]-a[1];
......
b[n]=a[n]-a[n-1]

10.问题引入:把数组a中[left,right]区间的每一个元素都加上c,那么也就是a[l]——>a[r]都加上c,这样时间复杂度会很高,我们只需要对其差分数组d操作:d[l]+=c,d[r+1]-=c即可,因为a是d的前缀和数组,d[l]+=c操作,会将a从left开始往后的元素全部+c,d[r+1]-=c操作会对从right+1开始往后的全部元素-c,这样也就是对left——>right之间的元素+c

11.一维差分公式:d[left]+=c,d[right+1]-=c;d是差分数组

12.模板:

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], d[N];
int n, m;//n代表a数组的长度,m代表查询次数
int main() {cin >> n >> m;for (int i = 1; i <= n; i++) {cin >> a[i];d[i] = a[i] - a[i - 1];}int left, right, c;while (m--) {cin >> left >> right >> c;d[left] += c;//第一步d[right + 1] -= c;//第二步}//求进行left——>到right区间加c后的数组for (int i = 1; i <= n; i++) {d[i] += d[i-1];cout << d[i]<<" ";}return 0;
}

13.二维差分:原数组:a[][],差分数组d[][]。(a是d的前缀和数组,d是a的差分数组)

14.如何构造差分数组d:d[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1]。理解了二维数组前缀和就可以明白这个。

15.模板:

#include<iostream>
using namespace std;
const int N = 1000;
int a[N][N], d[N][N];
int main() {int n, m, q;cin >> n >> m>>q;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> a[i][j];}}//构建差分数组for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {d[i][j] = a[i][j] - a[i - 1][j] - a[i][j - 1] + a[i - 1][j - 1];}}while (q--) {int x1, y1, x2, y2, c;cin >> x1 >> y1 >> x2 >> y2 >> c;d[x1][y1] += c;d[x1][y2 + 1] -= c;d[x2 + 1][y1] -= c;d[x2 + 1][y2 + 1] += c;}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {d[i][j] += d[i - 1][j] + d[i][j - 1] - d[i - 1][j - 1];}}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cout << d[i][j] << " ";}cout << endl;}return 0;
}

最后一些相关例题

P3131 [USACO16JAN] Subsequences Summing to Sevens S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P1387 最大正方形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

P3397 地毯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

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

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

相关文章

动态网页从数据库取信息,然后展示。

把数据库的驱动放在bin目录下。 通过servlet 读取数据库的内容&#xff0c;生成session,然后跨页面传给展示页。 package src;import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSe…

C# 使用PanGu分词

写在前面 这是官方介绍&#xff1a;盘古分词是一个中英文分词组件。作者eaglet 曾经开发过KTDictSeg 中文分词组件&#xff0c;拥有大量用户。作者基于之前分词组件的开发经验&#xff0c;结合最新的开发技术重新编写了盘古分词组件。 盘古分词组件需要配合其字典文件使用&am…

【上海大学数字逻辑实验报告】一、基本门电路

一、 实验目的 熟悉TTL中、小规模集成电路的外形、管脚和使用方法&#xff1b;了解和掌握基本逻辑门电路的输入与输出之间的逻辑关系及使用规则。 二、 实验原理 实现基本逻辑运算和常用逻辑运算的单元电路称为逻辑门电路。门电路通常用高电平VH表示逻辑值“1”&#xff0c;…

【中间件】配置中心中间件intro

中间件middleware 内容管理 why use 配置中心配置中心feature配置中心develop主流配置中心Apollo浅谈 本文从理论上介绍一下服务化中服务治理系统中的配置中心的理论并浅析Apllo 配置在生产中是很关键的一个部分&#xff0c;cfeng在work中遇到几次配置问题引发的问题&#xff0…

根据密码构成规则检测密码字符串

从键盘输入密码字符串&#xff0c;程序根据给定密码构成规则检测并给出对应提示。 (笔记模板由python脚本于2023年11月27日 19:27:47创建&#xff0c;本篇笔记适合熟悉Python字符串str对象的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.…

[原创][1]探究C#多线程开发细节-“Thread类的简单使用“

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi…

部署Jenkins

一、介绍 Jenkins 、Jenkins概念 Jenkins是一个功能强大的应用程序&#xff0c;允许持续集成和持续交付项目&#xff0c;无论用的是什么平台。这是一个免费的源代码&#xff0c;可以处理任何类型的构建或持续集成。集成Jenkins可以用于一些测试和部署技术。Jenkins是一种软件允…

01-鸿蒙4.0学习之开发环境搭建 HelloWorld

HarmonyOS开发学习 1.环境配置 1.下载地址 开发工具&#xff1a;DevEco Studio 3.1.1 Release 下载地址 安装选择快捷方式 安装nodejs和Ohpm 安装SDK 选择同意Accept 检测8项目是否安装成功 2.创建项目 —— hello word

用python实现kindle文件转换pdf

上一篇文章讲了下用工具转换相关的格式&#xff1a;https://blog.csdn.net/weixin_42019349/article/details/134654695 今天来分享一个python库实现上述功能&#xff0c;实现文件转换自由 ^_^ 主角就是pypandoc库 # 安装方式 pip install pypandoc# pypandoc主要有三个函数…

【高效开发工具系列】MapStruct入门使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

web:[NPUCTF2020]ReadlezPHP

题目 打开页面显示如下 没发现其他的线索&#xff0c;查看源代码 发现一个网址&#xff0c;访问这个页面查看 进行代码审计 这段代码是一个简单的 PHP 类&#xff0c;名为 HelloPhp。它有两个公共属性 $a 和 $b&#xff0c;并在构造函数中将它们分别初始化为字符串 "Y-m-…

每日一题--寻找重复数

蝶恋花-王国维 阅尽天涯离别苦&#xff0c; 不道归来&#xff0c;零落花如许。 花底相看无一语&#xff0c;绿窗春与天俱莫。 待把相思灯下诉&#xff0c; 一缕新欢&#xff0c;旧恨千千缕。 最是人间留不住&#xff0c;朱颜辞镜花辞树。 目录 题目描述&#xff1a; 思路分析…