【前缀和差分】详细使用方法

前缀和

前缀和的作用: 快速求出元素组中某段区间的和
为什么下标要从1 开始:为了方便后面的计算,避免下标转换,设为零,不影响结果

  • 定义两个数组,第一个为原始数组(a[]),第二个为前缀和数组(s[])

前缀和的计算 s[i] = s[i-1]+a[i]

int[] s = new int[x];
for (int i = 1; i <=n ; i++) {s[i] = s[i-1]+arr[i];
}

区间的和

s[r]-s[l-1]的结果就是所求区间的和

二维数组的前缀和问题

s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + arr[i][j]

输入区间范围(x1,y1,x2,y2),s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]的结果就是所求区间的和

差分问题

差分的作用:如果对某个区间需要每个元素加上C则需要使用差分来减少时间复杂度。
差分的重点是:构造临时数组b[]
两个数组:a[],b[],a[]称为b[]的前缀和,b[]称为a[]的差分

  void insert(int l,int r,int c){b[l] +=c;b[r+1] -=c;
}
//构造差分数组
for (int i = 1; i <=n ; i++) {b[i] = a[i]-a[i-1];
}
//插入方法:假设a[]中全部为0 则b[]也全部为0,可以执行插入操作
for(int i = 1; i <= n; i++){insert(i,i,a[i])
}
  • 将所求区间(l,r)在b[]数组划分出来并加上c,公式:b[l] +=c,b[r+1] -=c;

将差分数组转换成原数组,也就是求差分数组的前缀和,公式:a[i] = a[i-1] +b[i] //类比于s[i]=s[i-1]+a[i]

for (int i = 1; i <=n ; i++) {a[i] = a[i-1]+b[i];System.out.print(a[i]+" ");
}

二维数组的差分

b[][]是a[][]的差分数组

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

初始化原数组a[][]

for (int i = 1; i <=n; i++) {
for (int j = 1; j <=m ; j++) {
a[i][j] = sc.nextInt();
}
}

构造差分数组

初始化B数组从[1][1]到[i][j]添加元素,就是将a[][]中的元素遍历到B数组中

int[][] b = new int[x][x];
for (int i = 1; i <=n; i++) {
for (int j = 1; j <=m ; j++) {
insert(i,j,i,j,a[i][j]);
}
}

输入矩形中需要+c的范围(x1,y1)(x2,y2),在差分数组b[][]中找到相应的范围+c

while (q-- != 0){int x1,y1,x2,y2;x1 = sc.nextInt();y1 = sc.nextInt();x2 = sc.nextInt();y2 = sc.nextInt();int c = sc.nextInt();insert(x1,y1,x2,y2,c);
}

求b[][]数组中的前缀和-->a[][];公式:b[i][j]=a[i][j]−a[i−1][j]−a[i][j−1]+a[i−1][j−1]

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] + b[i][j];System.out.print(b[i][j]+" ");}
}

直接输出b[][]中的元素就是a[][]数组中范围所需要+c的结果
在这里插入图片描述

#include <bits/stdc++.h>  
//  2024-04-01  Come on !
using namespace std;  
#define  ll long long 
const int  N =1e5+10;
ll n,m,x,y,z;
ll a[N],D[N];int main() {  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); // no endll;  while(cin>>n>>m){for(int i=1;i<=n;i++){cin>>a[i];//TODOD[i]=a[i]-a[i-1];}while(m--){cin>>x>>y>>z;D[x]+=z;D[y+1]-=z;}//更新恢复for(int i=1;i<=n;i++){a[i]=a[i-1]+D[i];//TODOcout<<a[i]<<" ";}cout<<"\n";}return 0;  
}

practice 二维差分

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1010;
ll a[N][N], b[N][N];int main() {int n, m, q; cin >> n >> m >> q;for(int i = 1; i <= n; ++ i)for(int j = 1; j <= m; ++ j) cin >> a[i][j];while(q -- ) {int x1, y1, x2, y2, c; cin >> x1 >> y1 >> x2 >> y2 >> c;b[x1][y1] += c;b[x2 + 1][y1] -= c;b[x1][y2 + 1] -= c;b[x2 + 1][y2 + 1] += 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];a[i][j] += b[i][j];cout << a[i][j] << " " << " \n"[j == m];}return 0; 
}

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

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

相关文章

如何编辑PDF文件?分享一个好用的PDF编辑器

如何编辑PDF文件呢?大家在日常中经常会使用PDF文件,难免在使用的过程中会发现文件出现的错误,更正错误地方最简单有效的方法就是直接在PDF文件上进行编辑,但大家都知道PDF文件不易改动,该如何编辑呢? 在这里推荐给大家一个好用的PDF编辑器 PDFPatcher是一款开源免费的多…

基于arkTS开发鸿蒙app应用案例——通讯录案例

1.项目所用技术栈 arkTS node.js express mongoDB 2.效果图 3.源码 Index.ets&#xff08;登录页&#xff09; 登陆时让前端访问数据库中已经存好的账号密码&#xff0c;如果可以查询到数据库中的数据&#xff0c;则账号密码正确&#xff0c;登录成功&#xff0c;否则登录…

美食分享(源码+文档)

美食分享系统&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明含有功能项目截图客户端主页注册界面美食详细及教程界面搜索菜谱分类美食制作上传我的资料登录界面 管理端登录界面关键词管理用户管理分类管理历史管理菜谱管理 文件包含内容 1、搭建…

LINUX笔记温习

目录 DAY1 DAY2 day3&#xff1a; day4 day5 day6 day7 day8 day9 day10 day11 day12 day13 day14 day15 20day DAY1 1、多层级文件夹创建要带-p&#xff1b; 2、创建多文件&#xff0c;要先到该目录下才能创建(第一个目录必须存在才能有效建立)&#xff1b; D…

【Leetcode每日一题】模拟 - 替换所有的问号(难度⭐⭐)(48)

1. 题目解析 题目链接&#xff1a;6. Z 字形变换 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 想要画出N字形&#xff0c;我们首先要观察并找出其中的规律。假设我们用“row”来代表行数&#xff0c;当row等于4时&…

C# 排序的多种实现方式(经典)

一、 对数组进行排序 最常见的排序是对一个数组排序&#xff0c;比如&#xff1a; int[] aArray new int[8] { 18, 17, 21, 23, 11, 31, 27, 38 }; 1、利用冒泡排序进行排序&#xff1a; &#xff08;即每个值都和它后面的数值比较&#xff0c;每次拿出最小值&#xff09; s…

手机照片误删了怎么恢复?如何从 iPhone 恢复已删除的照片

照片是最容易从 iPhone 中意外删除的项目之一。好消息是它们也是最容易恢复的数据类型之一。至少&#xff0c;如果您一开始没有特意删除它们的话&#xff0c;它们是这样的。 如果你忘记了它们&#xff0c;情况就会变得更加困难。不过&#xff0c;您仍然有其他选择&#xff0c;…

【项目管理】史上最全的项目管理常用工具模板大合集

以下是资料目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff0c;海量免费资源等你领取&#xff1a;https://t.zsxq.com/18CJ6ZMZX 一、CMMI 3标准文档模板 1.CMMI3级精简并行过程综述 2.立项管理 3.结项管理 4.项目规划 5.项目监控 6.风险管理 7.需求管理 8.需求开…

win11安装WSL UbuntuTLS

win11安装WSL WSL 简介WSL 1 VS WSL 2先决要求安装方法一键安装通过「控制面板」安装 WSL 基本命令Linux发行版安装Ubuntu初始化相关设置root用户密码网络工具安装安装1panel面板指导 WSl可视化工具问题总结WSL更新命令错误Ubuntu 启动初始化错误未解决问题 WSL 简介 Windows …

vuepress-theme-hope 添加谷歌统计代码

最近做了个网站,从 cloudflare 来看访问量,过去 30 天访问量竟然有 1.32k 给我整懵逼了,我寻思不应该呀,毕竟这个网站内容还在慢慢补充中,也没告诉别人,怎么就这么多访问?搜索了下, cloudflare 还会把爬虫的请求也就算进来,所以数据相对来说就不是很准确 想到了把 Google An…

【STM32嵌入式系统设计与开发】——14PWM(pwm脉宽输入应用)

这里写目录标题 一、任务描述二、任务实施1、WWDG工程文件夹创建2、函数编辑&#xff08;1&#xff09;主函数编辑&#xff08;2&#xff09;USART1初始化函数(usart1_init())&#xff08;3&#xff09;USART数据发送函数&#xff08; USART1_Send_Data&#xff08;&#xff09…

C# wpf 实现底部嵌入HwndHost

WPF Hwnd窗口互操作系列 第一章 嵌入Hwnd窗口 第二章 嵌入WinForm控件 第三章 嵌入WPF控件 第四章 底部嵌入HwndHost&#xff08;本章&#xff09; 文章目录 WPF Hwnd窗口互操作系列前言一、如何实现&#xff1f;1、底部创建窗口&#xff08;1&#xff09;、创建透明窗口&…