算法基础,一维,二维前缀和差分详解

目录

1.前缀和

1.一维前缀和

 例题:【模板】前缀和

2.二维前缀和

例题:【模板】二维前缀和

2.差分

1.一维差分 

1.性质:d[i]的前缀和等于a[i]

2.性质:后缀区间修改

例题:【模板】差分

2.二维差分

例题:【模板】二维差分

例题:鼠鼠我鸭


1.前缀和

1.一维前缀和

前缀我们用prefix来表示

在最开始,我们有一个名为a和一个名为prefix的数组

那么prefix[2]的值就为a[1]+a[2]

prefix[3]的值就为a[1]+a[2]+a[3]

那么如何达成这一目的呢,我们用一下这段代码

for(int i = 1; i <= n; i++)
	cin >> a[i];
for(int i = 1; i <= n; i++)
    prefix[i] = prefix[i - 1] + a[i];

 

例题:【模板】前缀和

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 10;

ll a[N];
ll prefix[N];

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int t,n,q;
	cin >> t;
	while(t--)
	{
		cin >> n >> q;
		for(int i = 1; i <= n; i++)
			cin >> a[i];
		for(int i = 1; i <= n; i++)
			prefix[i] = prefix[i - 1] + a[i];
			
		while(q--)
		{
			int l,r;
			cin >> l >> r;
			cout << prefix[r] - prefix[l - 1] << '\n';
		}
	}
	return 0;
}

2.二维前缀和

prefix[i][j]表示的是从a[1][1]到a[i][j]之间所有数的和

举例:

a数组123
1
2
3

 

p3,3 = p2,3 + p3,2 - p2,2 + a3,3

由此可推出

pi,j = pi-1,j + pi,j-1 - pi - 1,j - 1 + ai,j

例题:【模板】二维前缀和

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e3 + 10;

ll a[N][N],p[N][N];

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	
	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];
	
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
			p[i][j] = p[i - 1][j] + p[i][j - 1] - p[i - 1][j - 1] + a[i][j];
	
	while(q--)
	{
		int x1,y1,x2,y2;
		cin >> x1 >> y1 >> x2 >> y2;
		cout << p[x2][y2] - p[x1 - 1][y2] - p[x2][y1 - 1] + p[x1 - 1][y1 - 1] << '\n';
	}
	
	return 0;
}

 

2.差分

1.一维差分 

差分数组,命名为d

则d[i] = a[i] - a[i-1](i >= 2)

d[1] = a[1]

1.性质:d[i]的前缀和等于a[i]

举例:

a[3] = d[1] + d[2] + d[3]

可以通过前缀还原为a[i]

2.性质:后缀区间修改

由性质1可知,当我们修改一个d的值时,从它下标开始往后的a数组都会相当的改变那么多的值

举例:

我们让d[3]加1,那么a[3],a[4],a[5]......都会加1。

如果我们再让d[6]减1,就可以使得只有a[3]到a[5]加了1这样的操作。

这样的后缀区间修改,是一个静态的,只能先修改再询问。

例题:【模板】差分

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 10;

ll a[N];
ll prefix[N];
ll diff[N];

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n,p,q;
	cin >> n >> p >> q;
	
	for(int i = 1; i <= n; i++)
		cin >> a[i];
	for(int i = 1; i <= n; i++)
		diff[i] = a[i] - a[i - 1];
		
	while(p--)
	{
		int l,r,x;
		cin >> l >> r >> x;
		diff[l] += x;
		diff[r + 1] -= x;
	}
	
	for(int i = 1; i <= n; i++)
		a[i] = diff[i] + a[i - 1];
	for(int i = 1; i <= n; i++)
		prefix[i] = prefix[i - 1] + a[i];
		
	while(q--)
	{
		int l,r;
		cin >> l >> r;
		cout << prefix[r] - prefix[l - 1] << '\n';
	}
	
	return 0;
}

2.二维差分

二维差分的规则为:

性质与一维差分相同

例题:【模板】二维差分

 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e3 + 10;

ll a[N][N],d[N][N];

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	
	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];
	
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
		{
			d[i][j] += a[i][j];
			d[i+1][j+1] += a[i][j];
			d[i+1][j] -= a[i][j];
			d[i][j+1] -= a[i][j];
		}
			
	while(q--)
	{
		int x1,y1,x2,y2,c;
		cin >> x1 >> y1 >> x2 >> y2 >> c;
		d[x1][y1] += c;
		d[x2 + 1][y1] -= c;
		d[x1][y2+1] -= c;
		d[x2+1][y2+1] += c;
	}
	
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= m; j++)
		{
			a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + d[i][j];
			cout << a[i][j] << " ";
		}
		cout << '\n';
	}
	
	return 0;
}

例题:鼠鼠我鸭

 

每次释放魔法,会改变最终的结果

假设这个魔法从第一个动物开始使用直到最后一个动物

我们用prefix[i]来表示从第一个动物开始直到第i个动物释放了魔法后算出来的总重量与未释放魔法时的总重量的偏移量

我们找到最小的偏移量的那个坐标和值,并且继续往后移动找到最大的那个偏移量

用最大减去最小,再加上未释放魔法的重量即为答案

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 10;

ll a[N],w[N],prefix[N];

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);	
	int t;
	cin >> t;
	while(t--)
	{
		int n;
		cin >> n;
		for(int i = 1; i <= n; i++)
		{
			cin >> a[i];
		}
		for(int i = 1; i <= n; i++)
		{
			cin >> w[i];
		}
		
		//不释放魔法时的答案
		ll ess = 0;
		for(int i = 1; i <= n; i++)
		{
			if(a[i] == 1)
				ess += w[i];
		}
		
		for(int i = 1; i <= n; i++)
		{
			prefix[i] = prefix[i - 1] + w[i] * (a[i] == 1 ? -1 : 1);
			//释放魔法后原来如果是1,答案会减少
		}
		
		ll fix = 0,mi = 0;
		for(int i = 1; i <= n; i++)
		{
			fix = max(fix,prefix[i] - mi);
			mi = min(mi,prefix[i]);
		}
		
		cout << fix + ess << '\n';
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[.NET] 查询当前已安装所有 Win32 与 UWP 应用

为了获取当前设备用户已安装的所有应用程序, 一般来讲有两种方案. 一种是通过查询 “shell:AppsFolder” 目录下所有项, 一种是从开始菜单中获取所有快捷方式, 然后加上查询所有已安装的 UWP 应用, 最后得到总列表. 如需代码参考, 请看 github.com/SlimeNull/WindowsAppsQuery …

Opencv(C++)学习 之RV1126平台的OPENCV交叉编译

本文特点&#xff1a;网上已经有了很多opencv移植RV1106的文章&#xff0c;本文主要记录基于cmake-gui编译&#xff0c;碰到的报错&#xff0c;及解决报错问题的方法&#xff0c;同时简单总结一些配置项相关的知识。 一、环境&#xff1a; ubuntu18 x64 RV1126交叉编译工具链 …

用HTML5 + JavaScript实现下雪效果

用HTML5 JavaScript实现下雪效果 下面是用HTML5 JavaScript实现下雪效果示例&#xff0c;展示了如何使用 HTML5 的 <canvas> 元素以及 JavaScript 来创建下雪效果。效果如下&#xff1a; 源码如下&#xff1a; <!DOCTYPE html> <html lang"en">…

逸学区块链【solidity】真随机数

参考Get a Random Number | Chainlink Documentation 但是很贵&#xff0c;价格 Gas Price&#xff1a;当前gas价格&#xff0c;根据网络状况而波动。Callback gas &#xff1a;返回您所请求的随机值时&#xff0c;回调请求消耗的gas 量。验证gas &#xff1a;量gas 用于验证…

应用层协议 ——— HTTP协议

应用层协议 ——— HTTP协议 HTTP简介认识URL二、登录信息三、服务器地址四、服务器端口号五、带层次的文件路径六、查询字符串七、片段标识符urlencode和urldecodeHTTP协议格式HTTP请求协议格式HTTP的方法HTTP的状态码HTTP常见的HeaderHTTPS VS HTTP对称加密 VS 非对称加密 HT…

Unity | YooAssetV2.1.0 + HybridCLR热更新

目录 一、项目更改 二、使用YooAsset热更 1.资源配置 2.资源构建 3.将两个文件夹下的资源上传CDN服务器 4.修改代码 5.运行效果 本文记录利用YooAssetHybridCLR来进行资源和dll的更新。YooAsset使用的是新版V2.1.0。相比于旧版&#xff0c;dll(原生文件)和资源要建两个p…

zabbix添加主机

zabbix添加主机 查看ip地址 [rootershi ~]# yum -y install net-tools [rootershi ~]# ifconfig eth0 |grep netmask |cut -d " " -f 10 192.168.88.20被监控主机安装zabbix-agent [root20 ~]# mount /dev/cdrom /mnt [root20 ~]# yum -y install wget [root20 ~]…

conda虚拟环境基础

【一文搞定最新版Anaconda】Win11 安装 Anaconda&#xff08;2023.9&#xff09;详解&#xff08;不删除旧版情况下下载、安装、注册、登录、设置环境变量、迁移旧环境、配置修改换源等&#xff09;连接Pycharm_win11安装anaconda-CSDN博客 conda命令大全&#xff08;create/in…

消息总线在微服务中的应用

直连式配置中心 上一篇文章介绍了 Spring Cloud 中的分布式配置组件 Config&#xff0c;每个服务节点可以从Config Server 拉取外部配置信息。但是似乎还有一个悬而未决的问题&#xff0c;那就是当服务节点数量非常庞大的时候&#xff0c;我们不可能一台一台服务器挨个去手工触…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(四)NodeJS入门——网络基础概念

041_网络基础概念_IP的介绍 hello&#xff0c;大家好&#xff0c;我们来一起认识一下IP。 在开始介绍 IP 之前&#xff0c;我们首先来介绍一个场景&#xff0c;方便大家去理解 IP 这个概念。比如这会儿强哥正在成都&#xff0c;然后还有另外一个小伙伴&#xff0c;谁呢&#x…

CodeFuse成功支持通义千问算法大赛,评测方案已开源

前段时间&#xff0c; 首届通义千问AI挑战赛成功举办&#xff0c;CodeFuse 为大赛提供技术支持&#xff0c;模型微调框架 MFTCoder 和 CodeFuseEval 评测框架为大赛保驾护航&#xff0c;助力大赛圆满完成。我们基于leetcode 阿里和蚂蚁最新面试题库建设了“模型赛马”在线打榜的…

25.云原生之ArgoCD-app of apps模式

文章目录 app of apps 模式介绍app如何管理apphelm方式管理kustomize方式管理 app of apps 模式介绍 通过一个app来管理其他app&#xff0c;当有多个项目要发布创建多个app比较麻烦&#xff0c;此时可以创建一个管理app&#xff0c;管理app创建后会创建其他app。比较适合项目环…

Ansible基础及常用模块

目录 1.前言 Ansible Ansible的特性 2.ansible环境安装部署 管理端安装ansible(192.168.88.22) ansible目录结构 配置主机清单 配置密钥对验证 3.ansible命令行模块 command 模块 shell 模块 ​编辑cron 模块 user 模块 group 模块 copy 模块 file 模块 hostn…

爱上算法:每日算法(24-2月2号)

&#x1f31f;坚持每日刷算法&#xff0c;将其变为习惯&#x1f91b; 题目链接&#xff1a;101. 对称二叉树 最开始肯定是比较简单的想法&#xff0c;就是遍历左右节点呀&#xff0c;不相等我就直接返回false。 但是这样错了&#xff0c;我们要的是以根节点为轴&#xff0c;而…

如何保证MySQL和Redis中的数据一致性?

文章目录 前言一、缓存案例1.1 缓存常见用法1.2 缓存不一致产生的原因 二、解决方案2.1 先删除缓存&#xff0c;再更新数据库2.2 先更新数据库&#xff0c;删除缓存2.3 只更新缓存&#xff0c;由缓存自己同步更新数据库2.4 只更新缓存&#xff0c;由缓存自己异步更新数据库2.5 …

Unity_使用Shader实现玻璃和镜面效果

效果图如下&#xff1a; 玻璃效果图 镜面效果图 Step1 搭建场景→镜子使用Quad代替&#xff0c;放置在需要反射的墙面→创建新的材质和Shader Step2 墙壁外创建Camera&#xff0c;用来渲染物体后方的视图→创建RenderTexture&#xff0c;赋于该相机 Step3 Shader的编写如下…

如何使用本地私有NuGet服务器

写在前面 上一篇介绍了如何在本地搭建一个NuGet服务器&#xff0c; 本文将介绍如何使用本地私有NuGet服务器。 操作步骤 1.新建一个.Net类库项目 2.打包类库 操作后会生成一个.nupkg文件&#xff0c;当然也可以用dotnet pack命令来执行打包。 3.推送至本地NuGet服务器 打开命…

来看看Tomcat和Web应用的目录结构

在前面两篇大致了解了Tomcat的架构和运行流程&#xff0c;以及Tomcat应用中的web.xml。 聊一聊Tomcat的架构和运行流程&#xff0c;尽量通俗易懂一点-CSDN博客 来吧&#xff0c;好好理解一下Tomcat下的web.xml-CSDN博客 那接下来&#xff0c;再看看Tomcat的目录&#xff0c;…

el-table点击某一行选中改变背景色且执行方法

elementUI table表格点击某一行选中并且改变背景色 使用:row-style"rowStyle"及row-click“selectRow”&#xff1a; 其中 selectRow 方法中&#xff1a; row 输出&#xff1a;当前行的内容 column 输出&#xff1a;当前列的信息 event 输出&#xff1a;当前事件 …

Unknown custom element:<xxx>-did you register the component correctly解决方案

如图所示控制台发现了爆红&#xff08;大哭&#xff09;&#xff1a; 报错解释&#xff1a; 当我们看到报错时&#xff0c;我们需要看到一些关键词&#xff0c;比如显眼的“component”和“name”这两个单词&#xff0c; 因此我们就从此处切入&#xff0c;大概与组件有关系。…