蓝桥备赛(24)算法篇【前缀和】

ops/2025/3/26 0:39:03/

一、前缀和

前缀和与差分的核心思想是   预处理 , 可以再暴力枚举的过程中 , 快速给出查询结果 , 从而优化时间复杂度。

是经典的用空间替换时间的做法 。

 

二、 一维前缀和

登录—专业IT笔试面试备考平台_牛客网

注意: 使用前缀和数组时候 , 下标必须从 1 开始计数 , 这样真的超级方便、简洁,规避了很多越界的情况 , 如果你下标从0开始 , 需要使用if 判断 ~

在来简述以下方法:

1.创建前缀和数组: f[i] = f[i − 1] + a[i] 

 2.查询 [l, r] 区间和: f[r] − f[l − 1]

#include <iostream>
using namespace std;typedef long long LL;
const int N = 1e5 + 10;
LL a[N],f[N];//f[N]前缀和数组
int n,q; int main()
{cin >> n >> q;for(int i = 1;i<=n;i++)cin >> a[i];//处理前缀和数组for(int i = 1 ;i<=n;i++){f[i] = f[i-1] + a[i];} //处理q次询问while(q--){int l,r;cin >> l >> r;cout << f[r] - f[l-1] << endl;} return 0;
}

三、最大字段和

P1115 最大子段和 - 洛谷

#include <iostream>
using namespace std;typedef long long LL;
const int N = 2e5 + 10; 
int n;
LL f[N];//前缀和数组 
int main()
{cin >> n;for(int i = 1;i<=n;i++){LL x;cin >> x;f[i] = f[i-1] + x;}//初始化为负的无穷大 //因为最小字段和也可能是负数 LL ret = -1e20;LL prevmin = 0;for(int i = 1;i<=n;i++){ret = max(ret,f[i]-prevmin);prevmin = min(prevmin,f[i]);}cout << ret << endl;return 0;
}

四、二维前缀和

登录—专业IT笔试面试备考平台_牛客网

#include <iostream>
using namespace std;typedef long long LL;
const int N = 1010;
int n,m,q;
LL f[N][N];int main()
{cin >> n >> m >> q;for(int i = 1;i<=n;i++){for(int j = 1;j<=m;j++){LL x;cin >> x;f[i][j] = f[i-1][j] + f[i][j-1] - f[i-1][j-1] + x;}}//处理q次查询while(q--){int x1,y1,x2,y2;cin >> x1 >> y1 >> x2 >> y2;cout << f[x2][y2] - f[x1-1][y2] - f[x2][y1-1]+f[x1-1][y1-1] << endl;}return 0;
}

五、激光炸弹

P2280 [HNOI2003] 激光炸弹 - 洛谷

#include <iostream>
using namespace std;const int N = 5010;
int n,m;
int a[N][N];
int f[N][N];//前缀和矩阵 int main()
{cin >> n >> m;while(n--){int x,y,v;cin >> x >> y >> v;x++,y++;//下标从1开始计数a[x][y] += v;//同一个位置,有可能存在多个目标}n = 5001;//预处理前缀和矩阵 for(int i = 1;i<=n;i++){for(int j = 1;j<=n;j++){f[i][j] = f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j];}}//枚举所有边长为m的正方形int ret = 0;m = min(m,n);//如果炸弹威力大,可以把整个区域全部都摧毁 for(int x2 = m;x2 <= n ; x2++){for(int y2 = m ; y2 <= n;y2++){int x1 = x2 - m +1;int y1 = y2 - m +1;ret = max(ret,f[x2][y2] - f[x1-1][y2] - f[x2][y1-1] + f[x1-1][y1-1]);}	} cout <<ret << endl;return 0;} 

http://www.ppmy.cn/ops/169792.html

相关文章

Qt的内存管理机制

在Qt中&#xff0c;显式使用new创建的对象通常不需要显式调用delete来释放内存&#xff0c;这是因为Qt提供了一种基于对象树(Object Tree)和父子关系(Parent-Child Relationship)的内存管理机制。这种机制可以自动管理对象的生命周期&#xff0c;确保在适当的时候释放内存&…

网络知识编-数据链路层(以太网 局域网通信 ARP协议 ARP 欺骗 DDos 攻击)

一、认识数据链路层 数据链路层位于物理层和网络层之间&#xff0c;其主要作用是将源自物理层的数据可靠地传输到相邻节点的目标主机的网络层。数据链路层通过物理介质&#xff08;如以太网、Wi-Fi等&#xff09;将数据分割成帧&#xff0c;并在相邻节点之间进行传输。其主要功…

从技术架构和生态考虑,不是单纯的配置优化,还有哪些方式可以提高spark的计算性能

从技术架构和生态系统层面提升Spark的计算性能&#xff0c;可采取以下核心策略&#xff1a; 一、计算模型重构与执行引擎升级 1. 弹性分布式数据集&#xff08;RDD&#xff09;的血统优化 通过RDD的Lineage&#xff08;血统&#xff09;机制实现容错时&#xff0c;采用增量式…

mysql数据实时全量+增量迁移

对mysql数据库实时全量增量迁移 在数据库管理中&#xff0c;实时全量增量迁移是一种常见的需求&#xff0c;特别是在数据库维护、备份恢复、数据迁移或数据同步等场景中。MySQL数据库提供了多种工具和方法来实现这一需求。以下是几种常见的方法来实现MySQL数据库的实时全量增量…

阿里qwen大模型AI智能分析实时对话生成病例的DEMO

Qwen大模型根据医患对话录音生成病例 业务背景涉及前端技术涉及后端技术阿里云文档完整代码&#xff08;复制即可运行&#xff09; 业务背景 在HIS或者其他医疗系统中&#xff0c;为了提高医生的现场或者线上问诊工作效率&#xff0c;在系统的开病例这块可以通过对话录音&…

AI小白的第七天:必要的数学知识(概率)

概率 Probability 1. 概率的定义 概率是一个介于 0 和 1 之间的数&#xff0c;表示某个事件发生的可能性&#xff1a; 0&#xff1a;事件不可能发生。1&#xff1a;事件必然发生。0 到 1 之间&#xff1a;事件发生的可能性大小。 例如&#xff0c;掷一枚公平的硬币&#xf…

C++学习笔记(二十六)——deque

一、std::deque &#xff08;1&#xff09;deque与其适用场景 std::deque&#xff08;双端队列&#xff0c;double-ended queue&#xff09;是 C STL&#xff08;标准模板库&#xff09;中的序列容器&#xff0c;类似于 std::vector&#xff0c;但支持在两端高效地插入和删除…

HDFS相关的面试题

以下是150道HDFS相关的面试题&#xff0c;涵盖了HDFS的基本概念、架构、操作、数据存储、高可用性、权限管理、性能优化、容错机制、与MapReduce的结合、安全性、数据压缩、监控与管理、与YARN的关系、数据一致性、数据备份与恢复等方面&#xff0c;希望对你有所帮助。 HDFS基本…