算法笔记(六):差分法

(6)差分法

目录

一、差分

1、介绍

2、定义

3、差分与前缀和 

二、一维差分

1、定义

2、作用

3、方法

 接下来是实战演练!!!

三、二维差分

1、定义

2、作用

3、方法

接下来是实战演练!!!

结论

写在最后!!!


一、差分

1、介绍

一般地,差分主要用于让一个序列某一特定范围内的所有值都加上或减去一个常数。

        所以差分往往应用于线性的场合,即一维数组的环境,但是除此之外,差分还可以应用于二维数组,但是相比较一维数组,应用的较少。 

2、定义

差分可以简单的看成序列中每个元素与其前一个元素的差。

3、差分与前缀和 

const int N = 100010;
int n; //n数组长度
//定义两个一维整形数组 a为原数组,b为差分数组
int a[N],b[N];  //根据定义可知
b[i] = a[i] - a[i-1];
//稍微具体
b[1] = a[1];
b[2] = a[2] - a[1];
b[3] = a[3] - a[2];
...
b[i] = a[i] - a[i-1];//转化一下,求数组b的前缀和,根据上面公式可得b[1]+b[2]+b[3]+...+b[i]
= a[1]+(a[2]-a[1])+(a[3]-a[2])+...+(a[i]-a[i-1])
= a[i]//由此可知,原序列为差分序列的前缀和序列
a[i] = b[1]+b[2]+b[3]+...+b[i];

    一般地,我们认为原序列就是差分序列的前缀和,所以把差分看做前缀和的逆运算

 

二、一维差分

1、定义

一维差分是指给定一个长度为n的序列a,要求支持操作pro(l,r,c)表示对a[l]~a[r]区间上的每一个值都加上或减去常数c,并求修改后的序列a。

2、作用

让一个序列中某个区间内的所有值均加上或减去一个常数。

可以将对a数组任意区间的同一操作优化到O(1)。

//区间[l,r]中的所有值都加上常数c
b[l] += c;
b[r+1] -= c;//上边语句实现原理 b相当于a的辅助数组
//把a序列分为[1,l-1],[l,r],[r+1,n]三部分,由差分定义和与前缀和关系可得
a[l-1] = b[1]+b[2]+...+b[l-1]; //b[1]~b[l-1]中所有值都未改变,a[l-1]也不变
a[l] = b[1]+b[2]+...+b[l-1]+b[l]; //b[1] += c,所以a[l] += c
a[l+1] = b[1]+b[2]+...+b[l-1]+b[l]+b[l+1]; //b[1] += c,所以a[l+1] += c
... //一直到
a[r] = b[1]+b[2]+...b[l]+...+b[r];  //b[1] += c,所以a[l+1] += c
a[r+1] = b[1]+b[2]+...b[l]+...+b[r]+b[r+1]; //b[l] += c,b[r+1] -= c;所以a[r+1]不变//所以由此可知上面的两个语句(b[l] += c;b[r+1] -= c)可以实现a数组在区间[l,r]内的所有值都加上了常数c

3、方法

对a数组区间[l,r]同时加上c的操作可转化为:

void insert(int l, int r, int c)
{b[l] += c;b[r+1] -= c;
}
while(m--)
{int l,r,c;scanf("%d%d%d",&l,&r,&c);insert(l,r,c);
}

 对b数组求前缀和即可得到原数组a:

for(int i = 1; i <= n; i++)
{b[i] += b[i-1];printf("%d ",b[i]);
}

 接下来是实战演练!!!

 题目:

 代码:

#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];printf("%d ",b[i]);}return 0;
}

 结果:

三、二维差分

1、定义

二维差分是指对于一个n*m的矩阵a,要求支持操作pro(x1,y1,x2,y2,a),表示对于以(x1,y1)为左上角,(x2,y2)为右下角的矩形区域,每个元素都加上常数a。求修改后的矩阵a。

2、作用

与一维差分一样二维差分可以把对矩阵的同一操作优化到O(1)。

图解:

3、方法

紫色矩形区域同时加上一个常数,由图可以得到插入函数:

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;
}

 初始化可以视为在(i,j)和(i,j)的小矩形内插入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]);}
}

 对二维差分数组求二维前缀和可以得到原数组:

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];printf("%d ",b[i][j]);}puts("");
}

接下来是实战演练!!!

题目:

 代码:

#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;
}

 结果:

结论

树状数组插入和查询都可以优化到O(logn)。差分和前缀和适合用在查询或修改次数十分巨大的时候,当修改和查询在同一复杂度时适合用树状数组。

写在最后!!!

这是做的acwing创始人闫神讲的学习视频笔记,但是作为算法小白,知识还很不牢固。如果有错误请欢迎指正~~,感谢!!!

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

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

相关文章

差分 --算法竞赛专题解析(32)

本系列文章将于2021年整理出版。前驱教材&#xff1a;《算法竞赛入门到进阶》 清华大学出版社 网购&#xff1a;京东 当当   作者签名书&#xff1a;点我 有建议请加QQ 群&#xff1a;567554289 文章目录 1. 一维差分1.1 一维差分的概念1.2 差分的局限性 2. 二维差分2.1 用差…

MiniGPT4,开源了

点击“开发者技术前线”&#xff0c;选择“星标” 让一部分开发者看到未来 量子位 | 公众号 QbitAI GPT-4识图功能迟迟不开放&#xff0c;终于有人忍不住自己动手做了一个。 MiniGPT-4来了&#xff0c;Demo开放在线可玩。 传一张海鲜大餐照片上去&#xff0c;就能直接获得菜谱。…

不愧是微软出品的工具,逆天!

上一篇&#xff1a;逆向了一款涉黄APP&#xff0c;发现了她们的小秘密... 大家好&#xff0c;今天分享一些微软出品的实用小工具&#xff0c;希望对大家有所帮助。 原文链接&#xff1a;https://www.pconline.com.cn/win11/1501/15013664.html 系统增强工具PowerToys 下载地址&…

人工智能AI如何工作及使用

chatgpt聊天软件是一款非常好玩的智能聊天软件&#xff0c;如果你觉得生活非常无趣&#xff0c;或者没有人能诉说烦恼&#xff0c;那么这款软件一定非常适合你。 小凡AI是一款专业的智能助手&#xff0c;可以帮助您快速、高效地处理各种工作任务。它包含强大的语音识别和自然语…

老胡的周刊(第094期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 qrbtf[2] 艺术二维码生成器&#xff1a; qrb…

两则靠谱的AI招聘信息;长文档阅读的辅助总结神器 Obsidian Copliot;LLM 应用开发全栈指南;重写人工智能时代的创业手册 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 两则靠谱的AI招聘信息&#xff1a;奇绩创坛 & Copilot Hub 6月14日&#xff0c;奇绩创坛在「奇绩大模型日报体验群」发布招聘信息…

比OpenAI更快一步,最新开源的MiniGPT-4模型可让开发者提前感受GPT-4识图能力!...

整理 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 迄今为止&#xff0c;GPT-4 凭借多模态能力已经成为 AI 领域备受关注的大模型&#xff0c;不过值得注意的是&#xff0c;OpenAI 在推出 GPT-4 时虽然引入了对图像理解的能力&#xff0c;但并没有在除了…

谷歌Bard大升级:支持中文,识图功能上线

出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013) 谷歌对话式 AI 产品 Bard 昨日发布了重要更新&#xff0c;现在已支持更多国家 / 地区和更多语言&#xff08;包括中文&#xff09;。 此外还添加了 Google Lens 功能 —— 可在 prompt 中使用图像&#xff0c;以及新…

ChatGPT类产品和技术的产生会带来哪些影响?

2023年3月15日&#xff0c;GPT-4的发布再次引爆互联网&#xff0c;原有的自然语言理解、推理和对话能力继续增强&#xff0c;更引入了识图等多模态识别功能&#xff0c;有研究认为可以将其视为“通用性人工智能”的初步阶段。在国内&#xff0c;百度同类产品“文心一言“的发布…

基于GPT-4的 IDEA 神仙插件,无需魔法,亲测好用!

近日&#xff0c;Intellij IDEA的插件商店&#xff0c;悄然上线了一个新的插件——Bito&#xff0c;据说可以基于GPT-4和ChatGPT来写代码。短短几天&#xff0c;已经有50多K的下载量了。 我帮大家试用了一下&#xff0c;亲测好用&#xff01; 根据插件介绍显示&#xff0c;Bito…

ChatGPT大浪潮下,AIGC已经开始改造时尚行业了

编辑 | 机器之心 点击下方卡片&#xff0c;关注“自动驾驶之心”公众号 ADAS巨卷干货&#xff0c;即可获取 点击进入→自动驾驶之心【AIGC】技术交流群 AIGC 这股风&#xff0c;吹到了时尚行业&#xff0c;会带来哪些生产力革新&#xff1f; 上线五天&#xff0c;用户破百万&am…

硅谷银行一夜倒闭,海量创业公司遭殃,工资房租统统拿不出

金磊 发自 凹非寺量子位 | 公众号 QbitAI 一夜之间&#xff0c;硅谷银行倒闭了。 这家最受科技和生命科学初创公司青睐的金融机构&#xff0c;就这么被美国联邦存款保险公司&#xff08;FDIC&#xff09;宣判了“死刑”。 事件影响之大&#xff0c;CNBC甚至这样评价&#xff1a…

让我们一起来看看可爱的猫咪吧

我想喜欢小猫咪的人&#xff0c;一定非常可爱和温柔吧 前言 这个视频中的小猫咪贼可爱&#xff0c;然后下面的那给进度条是只小猫咪走来走去的。 然后我就想可以拿进度条做点事情&#xff0c;一开始想搜一搜借鉴一下&#xff0c;但是根本没有这种高度自定义的。唉 经历 互联…

编写猫咪相册应用 HTML

文章目录 1. 标题元素标签2. p元素用于在网站上创建一段文本3. 注释4. 页面主要部分标识标签5. 通过使用img元素来为你的网站添加图片6. 使用锚点元素(a)链接到另一个页面7. 使用 section 元素将照片内容与未来的内容分开8. 无序列表(ul)元素&#xff0c;列表项(li)元素在列表中…

ChatGPT|一文读懂GPT-4!

前言 大家好&#xff0c;今天早上一早醒来&#xff0c;发现各大科技圈公众号平台开始刷屏OpenAI发布的新模型GPT4.0&#xff0c;看这个版本号就已经知道又是一大波特性的更新。 于是立马起来开始学习&#xff01; GPT-4 发布视频&#xff08;2023.03.15&#xff09; www.youtub…

李彦宏谈文心一言:市场反馈符合预期;OpenAI CEO 承认害怕 ChatGPT;Twitter 将开源推荐算法源码|极客头条

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&…

ChatGPT 拿测试 offer ?!

前段时间&#xff0c;全网都在说GPT&#xff0c;听说GPT能写代码、写用例、写算法、写论文、写策划方案、写日报周报新闻稿、种草笔记、视频脚本、作诗作词作曲、处理 Excel 。 心想&#xff1a;这也太厉害了吧&#xff01;都能帮忙写代码和写用例了&#xff0c;我是不是要被取…

读脑术!由大脑信号构建高清视频的方法实现啦,Stable Dinfusion还能这么用

夕小瑶科技说 分享 来源 | 量子位 作者 | 金磊 现在&#xff0c;AI可以把人类脑中的信息&#xff0c;用高清视频展示出来了&#xff01; 例如你坐在副驾所欣赏到的沿途美景信息&#xff0c;AI分分钟给重建了出来&#xff1a; 看到过的水中的鱼儿、草原上的马儿&#xff0c;也…

人工智能之深度学习常见应用方向你都了解吗?(文末福利)

本文导读 从零带你了解深度学习常见的7大应用方向&#xff0c;包括&#xff1a;数字识别、图像识别、图像分类、目标检测、人脸识别、文本分类、聊天机器人。 1. 数字识别 数字识别是计算机从纸质文档、照片或其他来源接收、理解并识别可读的数字的能力&#xff0c;目前比较受…