【基础算法练习】前缀和与差分模板

文章目录

  • 前缀和算法思想
  • 差分算法思想
  • C++ 版本的前缀和模板
    • 一维前缀和
    • 二维前缀和
  • C++ 版本的差分模板
    • 一维差分
    • 二维差分

前缀和算法思想

用 O(N) 的复杂度构建前缀和数组,通过这种方式达成 O(1) 的时间来得到区间和,说是一种算法,其实可以说是一种常用的算法思想

差分算法思想

用 O(N) 的复杂度构建差分数组,通过这种方式达成 O(1) 的时间让一个区域内的值同时 + C

C++ 版本的前缀和模板

一维前缀和

vector<int> v(N), arr(N); // v 是原数组, arr 是前缀数组for (int i = 1; i <= n; i++) arr[i] = arr[i - 1] + v[i];cout << arr[r] - arr[l - 1] << endl;

v 就是题目给出的数组,arr 就是我们构建的前缀和数组,求一维前缀和的公式就是:arr[i] = arr[i - 1] + v[i]

如果我们要求区间 [ l,r ],只需要:arr[r] - arr[l - 1]

二维前缀和

vector<vector<int>> vv(N, vector<int>(N)), arr(N, vector<int>(N));for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)arr[i][j] = vv[i][j] + arr[i - 1][j] + arr[i][j - 1] - arr[i - 1][j - 1];cout << arr[x2][y2] - arr[x1 - 1][y2] - arr[x2][y1 - 1] + arr[x1 - 1][y1 - 1] << endl;

二维前缀和的公式是:arr[i][j] = vv[i][j] + arr[i - 1][j] + arr[i][j - 1] - arr[i - 1][j - 1]

记忆方法: 把 i,j 位置本身(vv[i][j]),以及上面的前缀和,左边的前缀和加在一起,再减去他们共同的部分(加过两次的部分)

如果要求 (x1,y1) 到 (x2,y2) 这个区间内的值,用这个公式:arr[x2][y2] - arr[x1 - 1][y2] - arr[x2][y1 - 1] + arr[x1 - 1][y1 - 1]

记忆方法: 当前区域的前缀和,减去一个 x1-1 和一个 y1-1,分别配上 y2 和 x2,最后加上他们多减去的位置:arr[x1-1][y1-1]

(PS:这次没有 Golang 版本的代码,但其实都是一样的,开数组然后构建前缀和,不同语言没有任何差别,这里就摸鱼了)

C++ 版本的差分模板

一维差分

vector<int> v(N), arr(N);void insert(int l, int r, int c) {arr[l] += c;arr[r + 1] -= c;
}for (int i = 1; i <= n; i++) insert(i, i, v[i]);insert(l, r, c);for (int i = 1; i <= n; i++) arr[i] += arr[i - 1];

insert 函数的操作是让 [l,r] 的区间 + C

差分数组的性质就是,在 l 位置 + C,原数组 l 及之后的的区间值会全部 + C,让 r + 1 位置 - C,就能做到 O(1) 的时间复杂度,让原数组的 [l,r] 区间全部完成 + C 的操作

假设我们对差分数组 [l,l] 位置 + C,那其实就是让原数组的 l 位置 + C,我们就可以利用这个性质,通过 insert 操作通过原数组的值构建差分数组,之后还能复用 insert 方法完成区间值的修改

差分数组可以通过求自身的前缀和数组的形式,将差分数组转换成原数组,也就是:arr[i] += arr[i - 1]

二维差分

vector<vector<int>> vv(N, vector<int>(N)), arr(N, vector<int>(N));void insert(int x1, int y1, int x2, int y2, int c) {arr[x1][y1] += c;arr[x2 + 1][y1] -= c;arr[x1][y2 + 1] -= c;arr[x2 + 1][y2 + 1] += c;
} for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++)insert(i, j, i, j, vv[i][j]);insert(x1, y1, x2, y2, c);for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)arr[i][j] += arr[i - 1][j] + arr[i][j - 1] - arr[i - 1][j - 1];

二维差分跟一维也是同理,而且他的 insert 计算和前缀和刚好相反,比较好记忆,二维前缀是分别减去 x1-1,y1-1,加上 x1y1 都 -1,而二维差分是分别减去 x2+1,y2+1,然后加上 x2y2 都 +1

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

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

相关文章

何恺明 ResNet 引用量正式破20万!!!

注: 本文转自微信公众号 BravoAI (专注AI资讯和技术分享), 原文网址: 何恺明 ResNet 引用量正式破20万!!!, 扫码关注公众号 谷歌学术显示, 截止到 2024年1月26日, 何凯明 ResNet 一文引用量正式突破 20W!!! 更为惊人的是, 从论文发表到今天, 不过7年!!!‍‍‍‍‍‍‍‍‍‍‍‍…

springboot347基于web的铁路订票管理系统

获取源码——》公主号&#xff1a;计算机专业毕设大全

经典框架解读 | 论文+代码 | 3D Detection | OpenPCDet | PointRCNN

论文标题:PointRCNN: 3D Object Proposal Generation and Detection from Point Cloud 作者单位:The Chinese University of Hong Kong 代码:open-mmlab/OpenPCDet 论文:https://arxiv.org/pdf/1812.0424 第一次使用点云数据处理3D目标检测问题。 作者的观点: 1. 以前的…

预处理详解1❤

一&#xff1a;预定义符号 C语言中设置了一些预定义符号&#xff0c;它们可以直接使用&#xff0c;同时预定义符号是在预处理期间处理的。 以下就是相关的预处理符号的作用。 二&#xff1a;#define定义常量 首先基本的语法是 #define name stuff 相对比较简单&#xff…

Ultraleap 3Di配置以及在 Unity 中使用 Ultraleap 3Di手部跟踪

0 开发需求 1、硬件&#xff1a;Ultraleap 手部追踪相机&#xff08;Ultraleap 3Di&#xff09; 2、软件&#xff1a;在计算机上安装Ultraleap Gemini (V5.2) 手部跟踪软件。 3、版本&#xff1a;Unity 2021 LTS 或更高版本 4、Unity XR插件管理&#xff1a;可从软件包管理器窗…

Bagging方法的基本思想

Bagging方法的基本思想实现 在Bagging集成当中&#xff0c;我们并行建立多个弱评估器&#xff08;通常是决策树&#xff0c;也可以是其他非线性算法&#xff09;&#xff0c;并综合多个弱评估器的结果进行输出。当集成算法目标是回归任务时&#xff0c;集成算法的输出结果是弱…

乖乖,咱不用BeanUtil.copy了,咱试试这款神级工具(超详细)

引言 在现代Java应用程序开发中&#xff0c;处理对象之间的映射是一个常见而且必不可少的任务。随着项目规模的增长&#xff0c;手动编写繁琐的映射代码不仅耗时且容易出错&#xff0c;因此开发者们一直在寻找更高效的解决方案。比如基于Dozer封装的或者Spring自带的BeanUtil.…

AI Infra论文阅读之通过打表得到训练大模型的最佳并行配置

目录 0x0. 前言0x1. 摘要0x2. 介绍0x3. 背景0x4. 实验设置0x5. 高效的LLM训练分析0x5.1 Fused Kernels 和 Flash Attention0x5.1.1 Attention0x5.1.2 RMSNorm Kernel 0x5.2 Activation Checkpointing0x5.3 Micro-Batch 大小0x5.4 Tensor Parallelism和Pipline Parallelism0x5.5…

幻兽帕鲁服务器一键搭建脚本

前言 幻兽帕鲁刚上线就百万在线人数。官方服务器的又经常不稳定。所以这里给大家带来最快捷的搭建教程。废话不多说直接开始。 服务器配置要求 这里推荐腾讯云的轻量云服务器 测试环境&#xff1a; CPU &#xff1a; 2核 内存&#xff1a;4GB 系统&#xff1a;Debian 12 64…

二叉树的先序,中序,后序遍历

二分搜索树&#xff1a; 不了解的可以看这&#xff1a; 二分搜索树(Java&#xff09;-CSDN博客 中序遍历&#xff1a; public List<Integer> inorderTraversal(TreeNode root) {List<Integer>listnew ArrayList<>();midPai(root,list);return list;}publi…

leetcode:二叉树的中序遍历(外加先序,后序遍历)

题外&#xff1a;另外三种遍历可以看这&#xff1a; 层序遍历&#xff1a; Leetcode:二分搜索树层次遍历-CSDN博客 先序遍历&#xff1a; 二叉树的先序&#xff0c;中序&#xff0c;后序遍历-CSDN博客 后序遍历&#xff1a; 二叉树的先序&#xff0c;中序&#xff0c;后序…

鸿蒙开发(Harmonyos兼容与Harmonyos适配)

布局的实现 Layout_ability_main.xml布局&#xff1a; <?xml version"1.0" encoding"utf-8"?> <DirectionalLayoutxmlns:ohos"http://schemas.huawei.com/res/ohos"ohos:height"match_parent"ohos:width"match_pare…

测试人员为什么要编写测试用例?好的测试用例应该具备那些特点?

设计测试用例可以说是测试人员的一项最基本技能 。很多时候当我们接到设计测试用例的任务时 &#xff0c;往往都是想的该如何更快的完成这项任务 &#xff1f;而很少去想为什么要完成这项任务? 对于测试用例也是如此&#xff0c;为什么要设计测试用例呢(目的)&#xff1f;其实…

Jellyfin影音服务本地部署并结合内网穿透实现公网访问本地资源

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

拼图小游戏的界面和菜单的搭建

package Puzzlegame.com.wxj.ui;import javax.swing.*;public class GameJframe extends JFrame { //游戏主界面 public GameJframe(){//初始化界面initJFrame();//初始化菜单initJmenuBar();//让界面显示出来this.setVisible(true); }private void initJmenuBar() {//创建整个…

需求变化频繁的情况下,如何实施自动化测试

一.通常来说&#xff0c;具备以下3个主要条件才能开展自动化测试工作: 1.需求变动不频繁 自动化测试脚本变化的频率决定了自动化测试的维护成本。如果需求变动过于频繁&#xff0c;那么测试人员就需要根据变动的需求来不断地更新自动化测试用例&#xff0c;从而适应新的功能。…

qiankun子应用静态资源404问题有效解决(涉及 css文件引用图片、svg图片无法转换成 base64等问题)

在&#x1f449;&#x1f3fb; qiankun微前端部署&#x1f448;&#x1f3fb;这个部署方式的前提下&#xff0c;遇到的问题并解决问题的过程 最开始的问题现象 通过http请求本地的静态json文件404css中部分引入的图片无法显示 最开始的解决方式 在&#x1f449;&#x1f3…

行测-言语:2.语句表达

行测-言语&#xff1a;2.语句表达 1. 语句排序题 捆绑就是看两句话是不是讲的同一个内容&#xff0c;相同内容的句子应该相连。 1.1 确定首句 1.1.1 下定义&#xff08;……就是 / 是指&#xff09; A 1.1.2 背景引入&#xff08;随着、近年来、在……大背景 / 环境下&#…

Android 渲染机制

1 Android 渲染流程 一般情况下&#xff0c;一个布局写好以后&#xff0c;使用 Activity#setContentView 调用该布局&#xff0c;这个 View tree 就创建好了。Activity#setContentView 其实是通过 LayoutInflate 来把布局文件转化为 View tree 的&#xff08;反射&#xff09;…

使用Go语言编写自定义的HTTP代理:探险网络奇幻之旅

你是否曾经想过自己也能编写一个代理服务器&#xff0c;掌握网络冲浪的主动权&#xff1f;现在&#xff0c;有了Go语言&#xff0c;这个梦想不再遥不可及&#xff01;让我们一起踏上这段探险之旅&#xff0c;用Go语言编写一个自定义的HTTP代理&#xff0c;开启网络奇幻之旅&…