【算法基础】1.5 前缀和与差分

news2024/11/26 6:03:05

文章目录

  • 前缀和
    • 题目描述
    • 解法
    • 讲解
  • 二维前缀和
    • 题目描述
    • 解法
    • 讲解
  • 差分
    • 题目描述
    • 解法
    • 讲解
  • 二维差分
    • 题目描述
    • 解法
    • 讲解

前缀和

题目描述

输入一个长度为 n 的整数序列。
接下来再输入 m 个询问,每个询问输入一对 l,r。
对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。

在这里插入图片描述

解法

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    int n, m, l, r;
    scanf("%d%d", &n, &m);
    int a[n], s[n + 1];     // s设置为n+1是为了后面计算方便
    for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
    
    s[0] = 0;
    for (int i = 0; i < n; i ++ ) s[i + 1] = s[i] + a[i];
    
    while (m -- ) {
        scanf("%d%d", &l, &r);
        printf("%d\n", s[r] - s[l - 1]);	// 这里的l和r是1~n范围
    }
    return 0;
}

讲解

在这里插入图片描述

有 a1,a2,a3,a4,a5…
想求a2+a3+a4,则只需s4-s1 = (a1+a2+a3+a4) - (a1) = a2+a3+a4。


这道题中可以不初始化 s[0] = 0,事实上,他是任何数都可以,(因为它总是会被消去)。

二维前缀和

题目描述

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

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

在这里插入图片描述

解法

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    int n, m, q, x1, y1, x2, y2;
    scanf("%d%d%d", &n, &m, &q);
    int a[n][m], s[n + 1][m + 1];
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            scanf("%d", &a[i][j]);
            s[i + 1][j + 1] = a[i][j] + s[i + 1][j] + s[i][j + 1] - s[i][j];
        }
    }
    
    while (q--) {
        scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
        printf("%d\n", s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]);
    }
    
    return 0;
}

讲解

在这里插入图片描述
主要看这张图,类似于求面积。

求s:
s[i + 1][j + 1] = a[i][j] + s[i + 1][j] + s[i][j + 1] - s[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,c,表示将序列中 [l,r] 之间的每个数加上 c。

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

在这里插入图片描述

解法

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    int n, m, l, r, c;
    scanf("%d%d", &n, &m);
    int a[n + 1], b[n + 1]; // b是a的差分
    a[0] = 0;
    memset(b, 0, sizeof b);
    for (int i = 1; i <= n; i ++ ) {
        scanf("%d", &a[i]);
        b[i] = a[i] - a[i - 1];
    }
    
    while (m -- ) {
        scanf("%d%d%d", &l, &r, &c);
        b[l] += c;
        b[r + 1] -= c;
    }
    
    for (int i = 0; i < n; ++i) {
        a[i + 1] = a[i] + b[i + 1];
        printf("%d ", a[i + 1]);
    }
    
    return 0;
}

讲解

b 数组是 a 数组的差分,a 数组是 b 数组的前缀和。
那么,a中某一段变量同时变了一个数,相当于b中对应的两个数(开头和结尾)的变化。
在这里插入图片描述

二维差分

题目描述

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

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

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

在这里插入图片描述

解法

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1005;
int a[N][N], b[N][N];	// 开大一点可以减少越界的麻烦

int main()
{
    int n, m, q, x1, y1, x2, y2, c;
    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]);
            b[i][j] = a[i][j] - a[i - 1][j] - a[i][j - 1] + a[i - 1][j - 1];
        }
    }
    
    while (q -- ) {
        scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &c);
        b[x1][y1] += c;
        b[x2 + 1][y2 + 1] += c;
        b[x1][y2 + 1] -= c;
        b[x2 + 1][y1] -= c;
    }
    
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            a[i][j] = b[i][j] + a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

讲解

这里同样可以在脑海中想象那个正方形来帮助写代码。

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

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

相关文章

IVD-Net:多模态UNet在MRI中的椎间盘定位和分割

摘要 本文提出了一种多模态磁共振图像中的椎间盘&#xff08;IVD&#xff09;定位和分割体系结构&#xff0c;它扩展了UNet。与单一的图像相比&#xff0c;多模态的数据带来了互补的信息有助于更好的数据表示和判别能力。 在本文中&#xff0c;每种MRI模态的数据都以不同的路…

Waf功能、分类与绕过

一. waf工作原理 Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。 常见的系统攻击分为两类&#xff1a; 一是利用Web服务器的漏洞进行攻击&#xff0c;如DDOS攻击、病毒木马破坏等攻击&#xff1b;二是利用网页自身的安全漏洞进…

【C语言】实现通讯录(详解)

目录 一、需要实现的功能 1.1 类型和结构体的定义 二、拆分代码 2.1 游戏菜单 2.1.1 函数调用 2.1.2 函数体的实现 2.1.2运行效果 2.2 初始化结构体 2.2.1 函数调用 2.2.2 函数体的实现 2.2.3 运行结果 2.3 添加联系人信息 2.3.1 函数调用 2.3.2 函数体的实现 2…

操作系统之光--鸿蒙

鸿蒙是什么&#xff1f;鸿蒙包含Openharmony和harmonyOS。Openharmony是华为向开放原子开源基金会捐赠了鸿蒙开源部分的代码&#xff0c;归属于开放原子开源基金会。HarmonyOS是基于Openharmony的商业发行版本。目前大家华为手机上运行就是它。鸿蒙能做什么&#xff1f;很明显&…

【算法基础】1.6 双指针算法

文章目录双指针思想最长连续不重复子序列数组元素的目标和题目讲解判断子序列双指针思想 双指针算法&#xff0c;就是可以将 n ^ 2 优化到 n。 最长连续不重复子序列 给定一个长度为 n 的整数序列&#xff0c;请找出最长的不包含重复的数的连续区间&#xff0c;输出它的长度…

IO流的学习

文章目录一、File类的使用创建File实例File常用方法总结二、IO流分类读入数据的基本操作步骤&#xff08;第一种&#xff09;步骤&#xff08;第二种&#xff09;写出数据的基本操作步骤读入并写出数据的基本操作&#xff08;复制&#xff09;步骤注意处理流之一&#xff1a;缓…

【Nginx】静态资源部署(下)

文章目录静态资源的缓存处理缓存概述浏览器缓存相关指令expires指令add_header指令Nginx的跨域问题解决同源策略跨域问题跨域问题的案例演示解决方案静态资源防盗链什么是资源盗链Nginx防盗链的实现原理&#xff1a;针对目录进行防盗链静态资源的缓存处理 缓存概述 什么是缓存…

【爪洼岛冒险记】第4站:Java中如何进行控制台输入输出?用Java实现猜数字小游戏;超详细讲解Java中的方法:方法的重载,方法的签名

&#x1f331;博主简介&#xff1a;是瑶瑶子啦&#xff0c;一名大一计科生&#xff0c;目前在努力学习JavaSE。热爱写博客~正在努力成为一个厉害的开发程序媛&#xff01; &#x1f4dc;所属专栏&#xff1a;爪洼岛冒险记【从小白到大佬之路】 ✈往期博文回顾:链接: 【爪洼岛冒…

【文件指针+文件顺序读写操作函数】

1.文件的打开和关闭 1.1 什么是文件指针 2.文件操作函数 2.1 fgetc函数和fputc函数2.2 fgets函数和fputs函数2.3 fscanf函数和fprintf函数2.4 fwrite函数和fread函数 1.文件的打开和关闭 1.1 什么是文件指针&#xff1f; 每个被使用的文件都在内存中开辟了一个相应的文件…

文件操作详解

文章目录前言一、什么是文件&#xff1f;1.程序文件2.数据文件3.文件名二、文件的打开和关闭1.文件指针2.文件的打开和关闭3.打开模式汇总4.例子三.操作函数介绍1.基本函数2.fseek2.ftell3.rewind4.feof尾话前言 恐怕很多人学完了c语言甚至不知道文件操作&#xff0c;也确实&am…

FPGA学习笔记-知识点3-Verilog语法1

1.关键字 2.运算符 按其功能可分为以下几类: 1) 算术运算符(,&#xff0d;,&#xff0c;/,&#xff05;) 2) 赋值运算符(,<) 3) 关系运算符(>,<,>,<) 4) 逻辑运算符(&&,||,!) 5) 条件运算符( ? &#xff1a;) 6) 位运算符(,|,^,&,^) …

【微信小程序】动态设置导航栏标题

&#x1f3c6;今日学习目标&#xff1a;第十八期——动态设置导航栏标题 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰预计时间&#xff1a;25分钟 &#x1f389;专栏系列&#xff1a;我的第一个微信小程序 文章目录前言使用配置文件…

消息中间件简介

UNIX的进程间通信就开始运用消息队列技术&#xff0c;一个进程将数据写入某个特定的队列中&#xff0c;其它进程可以读取队列中的数据&#xff0c;从而实现异步通信。对于如今的分布式系统&#xff0c;消息队列已经演变为独立的消息中间件产品&#xff0c;相比于RPC同步通信的方…

设计模式_行为型模式 -《模板方法模式》

设计模式_行为型模式 -《模板方法模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象都…

测试开发 | AppCrawler 自动遍历测试实践(三):动手实操与常见问题汇总

上两篇文章介绍了自动遍历的测试需求、工具选择和 AppCrawler 的环境安装、启动及配置文件字段基本含义&#xff0c;这里将以实际案例更加细致的说明配置文件的用法和一些特殊场景的处理。 实操演示 常规使用 下面我们继续之前的例子&#xff0c;在雪球搜索框输入搜索内容后的页…

代码随想录算法训练营第六天 | 哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集, 202. 快乐数,1. 两数之和

第五天 周日 休息~【提醒补坑&#xff1a;链表总结还没写】一、参考资料哈希表理论基础文章连接&#xff1a;https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html有效的字母异位词题目链接/文章讲解/视频讲解&#xff1a;https:…

使用批处理__更改ip

1、使用.bat进行处理 echo off rem 测试更改ip netsh int ip set address "以太网 2" static 10.10.2.1 255.255.255.0 10.10.2.254 1 pause&exit 备注其他 echo #设静态IP netsh interface ip set address name"本地连接" sourcestatic addr192.16…

大坝安全监测解决方案 水库大坝安全监测系统改造工程方案

平升电子大坝安全监测系统根据SL551-2012《土石坝安全监测技术规范》的整编要求&#xff0c;设置了变形监测、渗流监测、环境量监测。借助大坝安全监测系统可及时了解大坝的工作性态和水库可能存在的事故隐患&#xff0c;为大坝安全管理与水库运行调度提供了准确、及时的现场信…

ElasticSearch7.10配置Search-Guard之配置用户

ElasticSearch7.10配置Search-Guard之配置用户 配置sg_internal_user.yml 密码是&#xff1a;elastic jode:hash: $2y$12$nUzkcjdnufzvI1HlmN7xSuND3skGhmwV5le5IINejz.asMFpLYNRybackend_roles:- "hr_department"psmith:hash: $2y$12$nUzkcjdnufzvI1HlmN7xSuND3sk…

[标准库]STM32F103R8T6 标准库配置RCC时钟和超频

前言 这篇博客总结一下学习到的配置时钟的方法。 从启动文件来看&#xff0c;MCU复位之后&#xff0c;执行到SystemInit()这个函数之后&#xff0c;会进入系统初始化设置&#xff0c;比如根据当前的MCU型号进入不同的条件编译语句&#xff0c;再配置相应的寄存器初始值&#…