算法基础学习|前缀和差分

news2024/12/28 21:44:33

前缀和

代码模板

一维前缀和模板
S[i] = a[1] + a[2] + ... a[i]
a[l] + ... + a[r] = S[r] - S[l - 1]

二维前缀和模板
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]

例题一

题目

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

接下来再输入 m 个询问,每个询问输入一对 l, r\leq 1000

对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。

输入格式

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

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

接下来 m 行,每行包含两个整数 l 和 r,表示一个询问的区间范围。

输出格式

共 m 行,每行输出一个询问的结果。

数据范围

1 \leq l \leq r \leq n,

1 \leq m,n \leq 100000,

-1000 \leq 数列中元素的值 \leq 1000

输入样例

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

输出样例

3
6
10

代码示例

#include <iostream>

using namespace std;

const int N = 100010;

int a[N],s[N];

int main(){
    int n, m;
    cin >> n >> m;
    
    for(int i = 1; i <= n; i++) 
    {
        cin >> a[i];
        s[i] = s[i - 1] + a[i];
    }
    
    int l, r;
    while(m--){
        cin >> l >> r;
        cout << s[r] - s[l - 1] << endl;
    }
    return 0;
}

例题二

题目

输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每个询问包含四个整数 x_1, y_1, x_2, y_2, 表示一个子矩阵的左上角坐标和右下角坐标。

对于每个询问输出子矩阵中所有数的和。

输入格式

第一行包含三个整数 n, m, q

接下来 n 行,每行包含 m 个整数,表示整数矩阵。

接下来 q 行,每行包含四个整数 x_1, y_1, x_2, y_2 表示一组询问。

输出格式

共 q 行,每行输出一个询问的结果。

数据范围

1 \leq n,m \leq 1000

1 \leq q \leq 200000

1 \leq x_1 \leq x_2 \leq n

1 \leq y_1 \leq y_2 \leq m

-1000 \leq 矩阵元素的值 \leq 1000

输入样例

3 4 3
1 7 2 4
3 6 2 8
2 1 2 3
1 1 2 2
2 1 3 4
1 3 3 4

输出样例

17
27
21

代码示例

#include<iostream>
#include<stack>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include<queue>
#include<map>
#include<cmath>

using namespace std;

const int N = 1010;
int m, n, q;
int s[N][N];

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
	cin >> n >> m >> q;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++) {
			cin >> s[i][j];
			s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
		}
	}
	int x1, y1, x2, y2;
	while (q--) {
		cin >> x1 >> y1 >> x2 >> y2;
		cout << s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1] << endl;
	}
}

差分

代码模板

一维差分
给区间[l, r]中的每个数加上c:B[l] += c, B[r + 1] -= c

二维差分
给以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵中的所有元素加上c:
S[x1, y1] += c, S[x2 + 1, y1] -= c, S[x1, y2 + 1] -= c, S[x2 + 1, y2 + 1] += c

例题一

题目

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

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

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

输入格式

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

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

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

输出格式

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

数据范围

1 \leq l \leq r \leq n,

1 \leq m,n \leq 100000,

-1000 \leq c \leq 1000

-1000 \leq 数列中元素的值 \leq 1000

输入样例

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

输出样例

3 4 5 3 4 2

代码示例

#include<iostream>
#include<stack>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include<queue>
#include<map>
#include<cmath>

using namespace std;

const int N = 100010;

int a[N], b[N];

void insert(int l, int r, int c) {
	b[l] += c;
	b[r + 1] -= c;
}

int main() {
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) 
    {
        cin >> a[i];
        insert(i, i, a[i]);
    }

	while (m--) {
		int l, r, c;
		cin >> l >> r >> c;
		insert(l, r, c);
	}

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

	for (int i = 1; i <= n; i++) cout << b[i] << " ";

	return 0;
}

例题二

题目

输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x_1, y_1, x_2, y_2, c, 其中 (x_1, y_1) 和 (x_2, y_2) 表示一个子矩阵的左上角坐标和右下角坐标。

每个操作都要将选中的子矩阵中的每个元素的值加上 c

请你将进行完所有操作后的矩阵输出。

输入格式

第一行包含整数 n,m,q

接下来 n 行,每行包含 m 个整数,表示整数矩阵。

接下来 q 行,每行包含 5 个整数 x_1, y_1, x_2, y_2, c 表示一个操作。

输出格式

共 n 行,每行 m 个整数,表示所有操作进行完毕后的最终矩阵。

数据范围

1 \leq n,m \leq 1000

1 \leq q \leq 100000

1 \leq x_1 \leq x_2 \leq n

1 \leq y_1 \leq y_2 \leq m

-1000 \leq c \leq 1000

-1000 \leq 矩阵元素的值 \leq 1000

输入样例

3 4 3
1 2 2 1
3 2 2 1
1 1 1 1
1 1 2 2 1
1 3 2 3 2
3 1 3 4 1

输出样例

2 3 4 1
4 3 4 1
2 2 2 2

代码示例

#include<iostream>
#include<stack>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include<queue>
#include<map>
#include<cmath>

using namespace std;

const int N = 1010;

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() {
    cin.tie(0);
    ios::sync_with_stdio(false);
	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];
			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];
			cout << b[i][j] << " ";
		}
		cout << endl;
	}

	return 0;
}

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

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

相关文章

如何最有效地使用ChatGPT:提问技巧与策略

前言 在如今信息技术高速发展的时代&#xff0c;像ChatGPT这样的大型自然语言处理模型为我们提供了一个强大的工具&#xff0c;以获取各种信息和答案。然而&#xff0c;要充分利用这一工具&#xff0c;您需要掌握一些提问技巧与策略&#xff0c;以确保获得最准确和有用的回答。…

人员定位在安全生产管理中的应用

人员定位技术正在成为安全生产管理中的重要工具&#xff0c;它利用各种定位技术来获取人员的位置信息&#xff0c;帮助管理人员更好地监控和保障人员安全。 关于人员定位管理 在安全管理工作中&#xff0c;人员定位技术主要用来跟踪和监测特定区域内的员工或来访者的位置&#…

CleanMyMac X免费macOS清理系统管家

近些年伴随着苹果生态的蓬勃发展&#xff0c;越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现&#xff0c;它的使用逻辑与Windows存在很多不同&#xff0c;而且随着使用时间的增加&#xff0c;一些奇奇怪怪的文件也会占据有限的磁盘空间&#xff0c;进而影响使用…

wordpress数据库迁移Invalid default value for ‘comment_date‘

问题说明 最近在往新的电脑上迁移一个wordpress网站&#xff0c;在往新电脑上的mysql数据库中导入数据时&#xff0c;报错&#xff1a;1067 - Invalid default value for comment_date。 异常分析 这个错误的字面意思就是字段‘comment_date’的默认值是无效的&#xff0c;于…

python爬虫语法

注释 单行注释 # 多行注释 ‘’’注释内容’’’ 变量类型 和java不同不需要定义数据类型 变量名变量值 Numbers&#xff08;数字&#xff09;&#xff1a;int&#xff08;有符号整型&#xff09;、long&#xff08;长整型[也可以代表八进制和16进制]&#xff09;、float&am…

用 HarmonyOS 做一个可以手势控制的电子相册应用(ArkTS)

介绍 本篇 Codelab 介绍了如何实现一个简单的电子相册应用&#xff0c;主要功能包括&#xff1a; 1. 实现首页顶部的轮播效果。 2. 实现页面多种布局方式。 3. 实现通过手势控制图片的放大、缩小、左右滑动查看细节等效果。 相关概念 ● Swiper&#xff1a;滑块视图容…

96核的AMD锐龙Threadripper PRO 7995WX性能如何?

AMD新推出的锐龙Threadripper 7000系列可以说是目前最快的工作站处理器&#xff0c;最顶级的锐龙Threadripper PRO 7995WX拥有96个Zen 4内核&#xff0c;共192线程&#xff0c;基础频率2.5GHz&#xff0c;加速频率5.15GHz&#xff0c;拥有384MB L3缓存和多达128条PCI-E 5.0通道…

深入理解 Python 中的真值和假值概念

目录 一、真值和假值的定义 二、技术原理 三、代码实现 四、注意事项 总结 在 Python 中&#xff0c;真值和假值是布尔类型&#xff08;bool&#xff09;的两个唯一可能的值。它们在程序的控制流中起着重要作用&#xff0c;用于判断条件是否满足&#xff0c;以及进行逻辑比…

Java进阶篇--Condition与等待通知机制

Condition简介 Condition是Java并发包中的一种机制&#xff0c;用于线程之间的协作和通信。它与锁&#xff08;Lock&#xff09;紧密配合使用&#xff0c;并提供了更高级别的等待/通知功能。 下面是Condition的一些特性和区别&#xff1a; 1. 精确唤醒&#xff1a;Condition…

【Spring篇】数据源对象管理加载properties文件

&#x1f38a;专栏【Spring】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f970;欢迎并且感谢大家指出小吉的问题 文章目录 &#x1f33a;数据源对象管理&#x1f6f8;基础版⭐在pom.xml文件中加入下面的代码&…

HVV(护网)蓝队视角的技战法分析

一、背景 1.HVV行动简介 HVV行动是国家应对网络安全问题所做的重要布局之一。从2016年开始&#xff0c;随着我国对网络安全的重视&#xff0c;演习规模不断扩大&#xff0c;越来越多的单位都加入到HVV行动中&#xff0c;网络安全对抗演练越来越贴近实际情况&#xff0c;各机构…

C++对象模型(20)-- 函数语义学:函数和变量的绑定问题

1、静态类型和动态类型 静态类型&#xff1a;对象定义时的类型&#xff0c;编译期间就确定好的。定义的时候是什么就是什么。 动态类型&#xff1a;对象目前所指向的类型&#xff0c;运行时才确定的类型。一般只有指针和引用才有动态类型。 比如下面的代码&#xff1a; cla…

SpringBoot+Vue实现AOP系统日志功能

AOP扫盲&#xff1a;Spring AOP (面向切面编程&#xff09;原理与代理模式—实例演示 logs表&#xff1a; CREATE TABLE logs (id int(11) NOT NULL AUTO_INCREMENT,operation varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 操作名称,type varchar(255) COLL…

博途S7-1200PLC自由口通信(Send_P2P和Receive_P2P指令编程)

S7-1200PLC的MODBUS-RTU通信的实战应用和完整SCL源代码,请参看下面的文章链接 https://rxxw-control.blog.csdn.net/article/details/132845221https://rxxw-control.blog.csdn.net/article/details/132845221MODBUS-RTU协议和常用功能码解读 https://rxxw-control.blog.csd…

【精选】自学网络安全的三个必经阶段(含路线图)

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…

[java进阶]——多线程Thread类,处理并发异常的方法

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、理解进程与线程 二、Thread类 三、自定义线程的三种实现方式 四、多线程应用场景 五、解决并发问题的方法 5.1 synchronized()关键字 - 同步代码块 5.2使用lock锁 一、理解进程与线程 运行一个程序占用…

VS Code设置代码自动保存

给新电脑安了VS Code&#xff0c;提交运行代码前总是忘了保存&#xff0c;之前的电脑里是设置了自动保存按钮&#xff0c;所以导致我在新电脑上总是忘了。特记录VS Code设置自动保存功能。 首先在右下角找到“设置”按钮 然后在输入框输入“auto save”进行查找 可以看到自动…

Centos磁盘爆满_openEuler系统磁盘爆满清理方法---Linux工作笔记060

磁盘爆满,监控部门就会报警,报警就要处理,但是程序员并不擅长做运维的工作,记录一下把...以后用到会方便: 使用df -h命令可以看到,对应的磁盘占用情况,这里我的/dev/mapper/openeuler-root这个目录 占用的磁盘比较多,到了百分之95了.. 往往就是这个跟目录,我这里/data目录是自…

CSDN提供的Markdown常用模板

标题 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#xff0c;除了标准的Markdown编辑器功能&#xff0c;我们增加了如下几点新功能&#xff0c;帮助你用它写博客&#xff1a; 全新的界面设计 &#xff0c;将会带来全新的写作体验&#xff1b;在创作中心设置…

1024程序员节特辑:【Spring Boot自动配置原理揭秘】

自动配置原理 概述原理Spring Boot Starterspring.factories 文件ConditionalOnX 注解配置 Bean配置属性 源码剖析复合AnnotationEnableAutoConfigurationAutoConfigurationImportSelector 主页传送门&#xff1a;&#x1f4c0; 传送 概述 Spring Boot 是一个用于创建独立的、…