一、个人理解

前面学习了前缀和算法,对于访问任意区间的速度是比较快的,但如果我们要修改某个区间的数呢,对于前缀和算法来说这还是有点棘手。

所以我们来学学新的算法:差分算法!

前缀和数组储存的是前n个数的和,而差分代表的是与前一个的差值。

为什么要这么储存呢???

因为这么储存之后,我们就可以对我们的原数组进行修改,假如我们在第 l 个位置加上一个值,就会影响后面所有的数值 ,这时候我们只需要在我我们要截止的地方后面一个数(也就是r+1)加上一个数值就可以了(后面的正负相抵没有了)。这样,就只用修改两处就让我们想要修改的区间全部修改好了。

我们该如何得到我们的值呢?

想必大家都学过数学的累加,既然存的是差值,我每一个都相加不就是我们要的答案吗??

为了防止越界,标记数组的索引从1开始。x0 = 0.

二、详细代码

#include<iostream>

using namespace std;

const int N =  + ;
int a[N], n, m;//a数组表示的是与前一个数的差值。 void insert(int l, int r, int c) {
a[l] += c;
a[r + ] -= c;
} int main() {
int x;
scanf("%d%d", &n, &m);
for (int i = ;i <= n;i++) scanf("%d", &x), insert(i, i, x); while (m--) {
int l, r, c;
scanf("%d%d%d", &l, &r, &c);
insert(l, r, c);
} for (int i = ;i <= n;i++) {
a[i] += a[i - ];
printf("%d ", a[i]);
}
return ;
}

三、升级---->差分矩阵

#include<iostream>
#include<cstdio>
using namespace std; const int N = ;
int a[N][N]; void insert(int x1, int y1, int x2, int y2, int c) {
a[x1][y1] += c;
a[x1][y2 + ] -= c;
a[x2 + ][y1] -= c;
a[x2 + ][y2 + ] += c;
} int main() {
int n, m, q, x1, y1, x2, y2, c;
scanf("%d%d%d", &n, &m, &q); for (int i = ;i <= n;i++)
for (int j = ; j <= m; j++)
scanf("%d", &c), insert(i, j, i, j, c); while (q--) {
scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &c);
insert(x1, y1, x2, y2, c);
} for (int i = ;i <= n; i++) {
for (int j = ;j <= m; j++) {
a[i][j] += a[i - ][j] + a[i][j - ] - a[i - ][j - ];
printf("%d ", a[i][j]);
}
printf("\n");
}
return ;
}

【蓝桥杯C/C++组】备赛基础篇之差分算法的更多相关文章

  1. 【蓝桥杯C组】备赛基础篇之高精度算法

    一.高精度加法 思路: 运用vector数组(c选手可用len来记录数组长度,数组去保存数字)将存入字符串里面的数字符倒叙保存,按照小学的加法列式,相加保存进位即可.具体参考代码. 详细代码解析: # ...

  2. 【蓝桥杯C组】备赛基础篇之前缀和算法

    算法介绍: 设a为数组,a[i]中储存的是前i 个数(包括自己)的总和,相当于我们中学学过的前N项和,那么,弄成这样的好处是什么呢?假如我们要多次访问一段区间的总和,难道每次都加一次进行重复运算吗?? ...

  3. 第六届蓝桥杯C++B组省赛

    1.奖券数目 2.星系炸弹 3.三羊献瑞 4.格子中输出 5.九数组分数 6.加法变乘法 7.牌型种数 8.移动距离 9.垒骰子 10.生命之树 1.奖券数目 奖券数目有些人很迷信数字,比如带“4”的 ...

  4. 蓝桥杯大学B组省赛2020模拟赛(一)题解与总结

    题目链接:https://www.jisuanke.com/contest/6516 A:题目: 我们称一个数是质数,而且数位中出现了 5 的数字是有趣的. 例如 5, 59, 457.求1到1000 ...

  5. 第七届蓝桥杯C++B组省赛

    1.煤球数目 2.生日蜡烛 3.凑算式 4.快速排序 5.抽签 6.方格填数 7.剪邮票 8.四平方和 9.交换瓶子 10.最大比例 今天是周三了,周天刚考完,这次做的还是不好(上次是全省最后一名). ...

  6. 2012年第三届蓝桥杯Java本科组省赛试题解析

    题目地址:https://wenku.baidu.com/view/326f7b4be518964bcf847c96.html?rec_flag=default    => 百度文档 题目及解析 ...

  7. 第三届蓝桥杯C++B组省赛

    1.微生物增值 2.古堡算式 3.海盗比酒量 4.奇怪的比赛 5.方阵旋转 6.大数乘法 7.放棋子 8.密码发生器 9.夺冠概率 10.取球博弈

  8. 第四届蓝桥杯C++B组省赛

    1.高斯日记 2.马虎的算式 3.第39级台阶 4.黄金连分数 5.前缀判断 6.三部排序 7.错误票据 8.翻硬币 9.带分数 10.连号区间数

  9. 第五届蓝桥杯C++B组省赛

    1.啤酒和饮料 2.切面条 3.李白打酒 4.史丰收速算 5.打印图形 6.奇怪的分式 7.六角填数 8.蚂蚁感冒 9.地宫取宝 10.小朋友排队

随机推荐

  1. ubuntu 14.04安装pycharm 社区版

    https://blog.csdn.net/u013733432/article/details/54425831 转载于:https://www.cnblogs.com/liu-shiliu/p/1 ...

  2. uboot on qemu

    1, download uboot ftp://ftp.denx.de/pub/u-boot/ 2, compile uboot make vexpress_ca9x4_config export A ...

  3. ServerVariables集合

    当讨论Request对象内容时,要研究的集合之一就是ServerVariables集合.这个集合包含了两种值的结合体,一种是随同页面请求从客户端发送到服务器的HTTP报头中的值,另外一种是由服务器在接 ...

  4. Clickhouse 条形图📊函数展示

    Clickhouse 条形图

  5. 数学--数论--中国剩余定理 拓展 HDU 1788

    再次进行中国余数定理 问题描述 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,-,mk两两互素,则下面同余方程组: x≡a1(mod m1) x≡ a2(mod ...

  6. 关于SPFA Bellman-Ford Dijkstra Floyd BFS最短路的共同点与区别

    关于模板什么的还有算法的具体介绍 戳我 这里我们只做所有最短路的具体分析. 那么同是求解最短路,这些算法到底有什么区别和联系: 对于BFS来说,他没有松弛操作,他的理论思想是从每一点做树形便利,那么时 ...

  7. 题解 P2261【[CQOI2007]余数求和】

    P2261[[CQOI2007]余数求和] 蒟蒻终于不看题解写出了一个很水的蓝题,然而题解不能交了 虽然还看了一下自己之前的博客 题目要求: \[\sum_{i=1}^{n}{k \bmod i} \ ...

  8. ubuntu 和 centos 如何区分系统

    Ubuntu Ubuntu有着漂亮的用户界面,完善的包管理系统,强大的软件源支持,丰富的技术社区,Ubuntu还对大多数硬件有着良好的兼容性,包括最新的图形显卡等等.这一切让Ubuntu越来越向大众化 ...

  9. 【HBase】HBase基本介绍和基础架构

    目录 基本介绍 概述 特点 HBase和Hadoop的关系 RDBMS与HBase的对比 特征 基础架构 基本介绍 概述 HBase是bigtable的开源java版本,是建立在HDFS之上,提供高可 ...

  10. java1.8新特性之stream

    什么是Stream? Stream字面意思是流,在java中是指一个来自数据源的元素队列并支持聚合操作,存在于java.util包中,又或者说是能应用在一组元素上一次执行的操作序列.(stream是一 ...