前缀和与差分笔记

25 篇文章 1 订阅
订阅专栏
这篇博客详细介绍了数组处理中的重要技巧,包括一维前缀和、二维前缀和的概念和计算方法,并通过例题展示了如何应用这些技巧解决区间和查询的问题。此外,还探讨了一维和二维差分操作,以及它们在序列和矩阵更新场景下的应用。解题代码展示了解决此类问题的具体实现。
摘要由CSDN通过智能技术生成

一维前缀和

思想:

问题:

为什么下标从1开始:为了定义s0

为什么定义s0=0:为了处理边界,比如:[1,10]的和,即:s10-s0,其实就是s10。

例题:

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

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

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

输入格式

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

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

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

输出格式

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

数据范围

1≤l≤r≤n,
1≤n,m≤100000,
−1000≤数列中元素的值≤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 n,m;
int a[N],s[N];

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i]; //前缀和的初始化
    
    while(m--)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        printf("%d\n",s[r]-s[l-1]); //区间和的计算
    }
    return 0;
}

二维前缀和

思想:

 例题:

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

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

输入格式

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

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

接下来 q 行,每行包含四个整数 x1,y1,x2,y2表示一组询问。

输出格式

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

数据范围

1≤n,m≤1000,
1≤q≤200000,
1≤x1≤x2≤n,
1≤y1≤y2≤m,
−1000≤矩阵内元素的值≤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>


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

int main()
{
    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]);
            
     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]+a[i][j]; //求前缀和
            
    while(q--)
    {
        int x1,y1,x2,y2;
        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;
}

一维差分

思想:

 

 例题

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

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

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

输入格式

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

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

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

输出格式

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

数据范围

1≤n,m≤100000
1≤l≤r≤n1,
−1000≤c≤1000,
−1000≤整数序列中元素的值≤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>

using namespace std;

const int N=100010;
int n,m;
int a[N],b[N];

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

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) insert(i,i,a[i]);//差分
    
    while(m--)
    {
        int l,r,c;
        scanf("%d%d%d",&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++) printf("%d ",b[i]);
    
    return 0;
}

二维差分

思想

 

 

例题:

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

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

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

输入格式

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

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

接下来 q 行,每行包含 5 个整数 x1,y1,x2,y2,c表示一个操作。

输出格式

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

数据范围

1≤n,m≤1000
1≤q≤100000
1≤x1≤x2≤n
1≤y1≤y2≤m
−1000≤c≤1000
−1000≤矩阵内元素的值≤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>
using namespace std;

const int N=1010;
int n,m,q;
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()
{
    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]);
    
     for(int i=1;i<=n;i++)
        for(int j=1;j<=m;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];
    
     for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++) printf("%d ",b[i][j]);
        puts("");
     }    
    return 0;
}

【有营养的算法笔记】基础算法 —— 推导证明前缀和差分
StackFrame
12-23 1424
一、二维前缀和与一、二维差分的深度解剖,包含算法推导和代码实现
算法笔记-滑动窗口/双指针/前缀和/差分
rao_raoW的博客
09-17 338
滑动窗口 分析题意,确定窗口的意义 设置窗口的left,right指针: (1)先移动右指针,当窗口满足条件时,记录状态; (2)再移动左指针,寻找下一个窗口 leetcode.1208 尽可能使字符串相等 class Solution { public:     int equalSubstring(string s, string t, int maxCost) 
795. 前缀和(模板题)
weixin_43793774的博客
07-18 356
AcWing 795. 前缀和题目思路代码 题目传送门 题解思路参考大佬 题目 输入一个长度为n的整数序列。 接下来再输入m个询问,每个询问输入一对l, r。 对于每个询问,输出原序列中从第l个数到第r个数的和。 输入格式 第一行包含两个整数n和m。 第二行包含n个整数,表示整数数列。 接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。 输出格式 共m行,每行输出一个询问的结果。 数据范围 1≤l≤r≤n,1≤n,m≤100000,−1000≤数列中元素的值≤10001≤l≤r≤n ,\\ 1≤n
前缀和差分
qcy的博客
02-18 202
1.前缀和 一维前缀和 例题:acwing795题(前缀和) 输入一个长度为 n 的整数序列。 接下来再输入 m 个询问,每个询问输入一对 l,r。 对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。 输入格式 第一行包含两个整数 n 和 m。 第二行包含 n 个整数,表示整数数列。 接下来 m 行,每行包含两个整数 l 和 r,表示一个询问的区间范围。 输出格式 共m行,每行输出一个询问的结果。 数据范围 1≤l≤r≤n, 1≤n,m≤100000, −1000≤数列中元素的值≤1000 输入样
模板:前缀和
aotao4494的博客
07-19 256
http://lfyzit.com/problem/10 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int a[90005], num, l, r, m, n; 5 int kd(){ 6 int r=0, f=1; 7 char...
前缀和模板
拧发条鸟的博客
11-25 193
前缀和 1.一维数组前缀和 以力扣第303道题为例。题目描述如下:给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。 正常思路是遍历数组,将nums[i]到nums[j]的数字相加,时间复杂度为O(n)。那么有没有办法将时间复杂度降为O(1)呢?答案是肯定的,就是前缀和。所谓前缀和,就是 nums[i]之前全部元素的和。 用一个数组(preSum)存储前缀和,那么这题就变成了preSum[j]-preSum[i]。接下来就用代码实现前缀和。 //前缀和
【模板题】前缀和
一只快乐的小蒟蒻~
10-07 147
【题目描述】 输入一个长度为n的整数序列。 接下来再输入m个询问,每个询问输入一对l,r。 对于每个询问,输出原序列中从第l个数到第r个数的和。 【输入格式】 第一行包含两个整数n和m。 第二行包含n个整数,表示整数数列。 接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。 【输出格式】 共m行,每行输出一个询问的结果。 【数据范围】 1≤l≤r≤n 1≤n,m≤100000 −1000≤数列中元素的值≤1000 【输入样例】 5 3 2 1 3 6 4 1 2 1 3 2 4 【输出样例】 3
学习笔记-前缀和差分
最新发布
08-17
学习笔记-前缀和差分
前缀和差分算法学习笔记精要
资源摘要信息:"前缀和差分是计算机科学中数据处理和算法设计中的重要概念,广泛应用于各种编程挑战和实际问题中。前缀和是一种快速计算数组区间和的方法,而差分是一种用来快速处理数组区间修改的技巧。" 一、...
AcWing 算法基础课第二节基础算法2高精度、前缀和差分
qq_44946232的博客
09-04 738
none
[模板题]前缀和
代码中枢:软件工程理论与实践的桥梁
03-10 343
来源: 模板题 算法标签 前缀和 题目描述 输入一个长度为n的整数序列。 接下来再输入m个询问,每个询问输入一对l, r。 对于每个询问,输出原序列中从第l个数到第r个数的和。 输入格式 第一行包含两个整数n和m。 第二行包含n个整数,表示整数数列。 接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。 输出格式 共m行,每行输出一个询问的结果。 数据范围 1≤l≤r≤n, 1≤n,m≤1...
前缀和模板题h
04-17 267
标题:数学考试 题目: 链接:https://ac.nowcoder.com/acm/problem/15553 来源:牛客网 题目描述 今天qwb要参加一个数学考试,这套试卷一共有n道题,每道题qwb能获得的分数为ai,qwb并不打算把这些题全做完, 他想选总共2k道题来做,并且期望他能获得的分数尽可能的大,他准备选2个不连续的长度为k的区间, 即[L,L+1,L+2,…,L+k-1],[R,R...
前缀和、子矩阵和
qq_51993749的博客
09-03 138
前缀和、子矩阵和
子矩阵的和(前缀和模板)
weixin_51314022的博客
04-21 130
【题目描述】 输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每个询问包含四个整数 x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 【输入格式】 第一行包含三个整数 n,m,q。 接下来 n 行,每行包含 m 个整数,表示整数矩阵。 接下来 q 行,每行包含四个整数 x1,y1,x2,y2,表示一组询问。 输出格式 共 q 行,每行输出一个询问的结果。 【数据范围】 1≤n,m≤1000, 1≤q≤200000, 1≤x1≤x2≤n, 1≤y1
子矩阵的和-前缀和
qq_41581913的博客
01-27 299
输入一个n行m列的整数矩阵,再输入q个询问,每个询问包含四个整数x1, y1, x2, y2,表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 输入格式 第一行包含三个整数n,m,q。 接下来n行,每行包含m个整数,表示整数矩阵。 接下来q行,每行包含四个整数x1, y1, x2, y2,表示一组询问。 输出格式 共q行,每行输出一个询问的结果。 数据范围 1≤n,m...
【AcWing】前缀和前缀和模板)
L_NanN的博客
03-13 635
AcWing 前缀和 题解
前缀和」代码模板及例题解析 | LeetCode(力扣)算法题
负雪明烛
09-06 2638
前缀和 PreSum」代码模板套路、例题讲解、清晰图解算法,「前缀和」问题汇总。LeetCode、力扣、算法题系列,包含 C++,Java, Python 三种语言的代码。本文包含思路、公式、代码、解析,还有练习题推荐。「前缀和」文章,看这一篇就够了。
【刷题】基础算法——前缀和【模板】
qq_42581685的博客
01-22 174
用s[i]记下a[1] + a[2] + … + a[i]的和 这样可以直接求出区间[l, r]的和s[r] - s[l - 1] #include <iostream> using namespace std; int n, m, s[100005]; int main() { scanf("%d%d", &n, &m); int a; for (int i = 1; i <= n; i ++ ) { scanf("%d",
前缀和差分模板
Tom的博客
08-10 450
一维和二维前缀和差分前缀和是指某个序列的前 n 项和,可以把它理解为数学上的数列的前 n 项和,而差分可以看成前缀和的逆运算。
写文章

热门文章

  • 递归与递推 2097
  • 数学知识(一):数论 1245
  • 数学知识(二):欧拉函数、快速幂、扩展欧几里得算法、中国剩余定理 905
  • 动态规划(一):背包问题 898
  • 数据结构基础(一):链表与邻接表,栈与队列,KMP 664

分类专栏

  • 蓝桥杯 4篇
  • 算法基础 25篇

最新评论

  • 数学知识(二):欧拉函数、快速幂、扩展欧几里得算法、中国剩余定理

    CSDN-Ada助手: 多亏了你这篇博客, 解决了问题: https://ask.csdn.net/questions/8005578, 请多输出高质量博客, 帮助更多的人

  • 离散化算法笔记(保序)

    黒猫.: for(item:add)是什么意思

  • 搜索与图论(二):最短路径(没有负环)

    芝麻糊了517: 这是y总的代码吧。。好歹给个出处

  • 数据结构(三)哈希表 、STL使用技巧

    稻城亚丁: y总yyds

  • 数据结构(三)哈希表 、STL使用技巧

    氾水浮萍: 一眼认出yxc的字

大家在看

  • ackerman函数的非递归和递归 (C++) 282
  • Elasticsearch快速入门(1) 711
  • 为什么需要使用代理进行 SEO? 42
  • 网络安全人员必知的35个安全框架及模型 520
  • jsp高校二手物品交易网站k7020程序+源码+数据库+调试部署+开发环境

最新文章

  • 枚举、模拟与排序
  • 数学与简单DP
  • 二分与前缀和
2022年8篇
2021年21篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家天津玻璃钢卡通雕塑价格玻璃钢雕塑施工批发玻璃钢运动雕塑报价百色玻璃钢雕塑厂安顺商场美陈搭建常州商场美陈道具广州玻璃钢雕塑摆件设计昭通市玻璃钢雕塑设计定制丹东玻璃钢雕塑南宁景区玻璃钢雕塑设计博尔塔拉园林玻璃钢雕塑价格福建中庭商场美陈价格芜湖玻璃钢雕塑定做公司青岛玻璃钢雕塑生产商杭州浙江玻璃钢雕塑玻璃钢雕塑业务员好干嘛商场美陈布置装饰达州玻璃钢雕塑摆件打造价格贵州广场玻璃钢雕塑价格上海主题商场美陈生产厂家玻璃钢小王子雕塑商场秋美陈布置方案吉林人物玻璃钢雕塑定做现代玻璃钢人物雕塑销售方法榆次玻璃钢人物雕塑各地好的玻璃钢雕塑杭州商场美陈多少钱许昌玻璃钢雕塑厂在台湾玻璃钢雕塑厂哪家专业天津玻璃钢雕塑人体香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化