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

目录

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

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

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

相关文章

Jetpack Compose系列(2)-基础组件

从Hello Android 开始 接上篇文章&#xff0c;打开默认工程后我们会看到一段Hello Android&#xff01;默认代码。 class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {MyAppl…

【2024.2.2练习】子串简写(20分)

题目描述 题目思路 思维题&#xff0c;题型上有点双指针的感觉。如果对字符串进行暴力枚举显然会超时。不妨指针一边移动一边进行记录。当指针A移动到第个字母时&#xff0c;指针B移动到第个字母&#xff0c;并记录之前所有经过的次数。 由于找不到简洁的与的递推关系&#x…

面试经典150题 -- 哈希表(总结)

总的链接 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 383 . 赎金信 用哈希表模拟 ; 用两个长为26的整数数组模拟哈希表&#xff0c;分别统计r和m中的频次&#xff0c;如果在m中字符出现的都比r中的小&#xff0c;那么m一…

FUXA远程命令执行漏洞(CVE-2023-33831)

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Day 17------C语言收尾之链表的删除、位运算、预处理、宏定义

链表 空链表&#xff1a; 注意&#xff1a;函数不能返回局部变量的地址 操作&#xff1a; 1.创建空链表 2.头插 3.尾插 4.链表遍历 5.链表的长度 free&#xff1a;释放 删除&#xff1a; 头删 void popFront(struct Node *head) { //1.p指针变量指向首节点 //2.断…

BeanDefinitionReader学习

Spring版本5.1.0 Spring中的BeanDefinitionReader是一个接口&#xff0c;用于读取BeanDefinition并将其注册到Spring容器中。BeanDefinitionReader的主要作用是从资源文件中读取配置信息&#xff0c;并将其转换为BeanDefinition对象&#xff0c;然后将其注册到Spring容器中。B…

springboot完成一个线上图片存放地址+实现前后端上传图片+回显

1.路径 注意路径 2.代码&#xff1a;&#xff08;那个imagePath没什么用&#xff0c;懒的删了&#xff09;&#xff0c;注意你的本地文件夹要有图片&#xff0c;才可以在线上地址中打开查看 package com.xxx.common.config;import org.springframework.beans.factory.annotat…

【云手机】快速获取一台属于你的云手机,在云上调试你的应用!

0x00 前言 随着科技的飞速发展&#xff0c;云手机已然成为一种云端虚拟商品&#xff0c;它打破地域限制&#xff0c;让你随时随地畅享移动体验。红手指、小鱼云手机等平台虽便捷易用&#xff0c;却在可扩展性和隐私性方面有所欠缺。冗长的《隐私政策》是否让你望而却步&#x…

LabVIEW潜油电泵数据采集系统

LabVIEW潜油电泵数据采集系统 介绍一个基于LabVIEW的潜油电泵数据采集系统。该系统目的是通过高效的数据采集和处理&#xff0c;提高潜油电泵的性能监控和故障诊断能力。 系统由硬件和软件两部分组成。硬件部分主要包括数据采集卡、传感器和电泵等&#xff0c;而软件部分则是…

网络开启代理之后git还是连接超时

网络开启代理之后git还是连接超时 当电脑开启网络代理之后&#xff0c;浏览器能够正常访问GitHub&#xff0c;可是使用git拉取仓库时还是超时。 问题 $ git clone https://github.com/xxx/notes.git Cloning into notes... fatal: unable to access https://github.com/xxx/…

ARM架构可视化ROS消息方案部署

ARM架构可视化ROS消息方案部署 三种方案, 1. webviz 2. foxglove 3. rosviz 注: web要用firefox, chromimum用不了, 可能是因为取消了时间同步机制的原因 先说三种方案的优劣, webviz 延迟比较高, 但是部署相对简单, foxglove 部署比较费劲, 但是效果不错, 延迟低, 本文会尽…

KMP算法解决——找出字符串中第一个匹配项的下标(深入图解KMP算法)

"The only way to do great work is to love what you do." ​- Steve Jobs 首先我们先来回顾一下题目&#xff1a; 1. 先正儿八经的拿比较官方的说法来解释一下KMP算法 KMP&#xff08;Knuth-Morris-Pratt&#xff09;算法是一种用于在一个文本串中查找一个模式串…