news 2026/4/15 16:14:42

算法学习日记 | 前缀和

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法学习日记 | 前缀和

🧠 算法学习日记 | 今天我用「前缀和」解了两道题,原来“预处理”能这么强!

大家好,我是你们的算法学习搭子 👋
今天继续我的算法入门之旅,重点练习了**前缀和(Prefix Sum)**这一高效的数据预处理技巧。

很多人觉得“前缀和”只是用来快速求区间和的工具,但其实,它是一种通过空间换时间的典型思想。
只要我们提前把信息存好,就能在 $ O(1) $ 时间内回答任意查询。

今天我完整做了两道题,每一道都坚持用最朴素的前缀和逻辑实现。下面我把题目原文我的原始代码原封不动贴出来,不做任何删减或美化,只为真实记录学习过程。


🔹 题目一:区间次方和

问题描述
给定一个长度为 $ n $ 的整数数组 $ a $ 以及 $ m $ 个查询。
每个查询包含三个整数 $ l, r, k $,表示询问 $ l \sim r $ 之间所有元素的 $ k $ 次方和。
请对每个查询输出一个答案,答案对 $ 10^9 + 7 $ 取模。

输入格式
第一行输入两个整数 $ n, m $,其含义如上所述。
第二行输入 $ n $ 个整数 $ a[1], a[2], \ldots, a[n] $。
接下来 $ m $ 行,每行输入三个整数 $ l, r, k $,表示一个查询。

输出格式
输出 $ m $ 行,每行一个整数,表示查询的答案对 $ 10^9 + 7 $ 取模的结果。

样例输入

5 3 1 2 3 4 5 1 3 2 2 4 3 3 5 1

样例输出

14 99 12

评测数据规模
对于 100% 的评测数据:$ 1 \leq n, m \leq 10^5,,1 \leq a[i] \leq 100,,1 \leq l \leq r \leq n,,1 \leq k \leq 5 $。

✅ 我的代码

#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constll N=1e5+9;ll a[6][N],prefix[6][N];constll p=1e9+7;intmain(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);intn,m;intl,r,k;cin>>n>>m;for(inti=1;i<=n;++i)cin>>a[1][i];for(inti=2;i<=5;++i){for(intj=1;j<=n;++j){a[i][j]=(a[i-1][j]*a[1][j])%p;}}for(inti=1;i<=5;++i){for(intj=1;j<=n;++j){prefix[i][j]=(prefix[i][j-1]+a[i][j])%p;}}for(inti=0;i<m;++i){cin>>l>>r>>k;cout<<((prefix[k][r]-prefix[k][l-1]+p)%p)<<endl;}return0;}

🔹 题目二:小郑的蓝桥平衡串

问题描述
平衡串指的是一个字符串,其中包含两种不同字符,并且这两种字符的数量相等。

例如,abababaababb都是平衡串,因为每种字符各有三个,而abaabaaaab都不是平衡串,因为它们的字符数量不相等。

平衡串在密码学和计算机科学中具有重要应用,比如可以用于构造哈希函数或者解决一些数学问题。

小郑拿到一个只包含 $ L、、Q $ 的字符串,他的任务就是找到最长平衡串,且满足平衡串的要求,即保证子串中 $ L、、Q $ 的数量相等。

输入格式
输入一行字符串,保证字符串中只包含字符 $ L、、Q $。

输出格式
输出一个整数,为输入字符串中最长平衡串的长度。

样例输入

LQLL

样例输出

2

评测数据规模
对于所有评测数据,输入字符串的长度 $ len \leq 1000 $。

✅ 我的代码

#include<bits/stdc++.h>usingnamespacestd;constintN=1010;intprefix[N];intmain(){string s;cin>>s;intn=s.length();prefix[0]=0;for(inti=0;i<n;++i){if(s[i]=='L'){prefix[i+1]=prefix[i]+1;}else{prefix[i+1]=prefix[i]-1;}}intans=0;for(intl=0;l<=n;++l){for(intr=l+1;r<=n;++r){if(prefix[r]==prefix[l]){intlen=r-l;if(len>ans)ans=len;}}}cout<<ans;return0;}

🌟 我的思考

这两道题虽然看起来完全不同,但都用了前缀和的思想

  • 区间次方和:先预处理出每个幂次的前缀和,再用 $ \text{sum}[r] - \text{sum}[l-1] $ 快速回答查询。
  • 平衡串:用prefix[i]表示从开头到第 $ i $ 位,LQ的差值。当两个位置的prefix值相等时,说明中间子串是平衡的。

你会发现:

前缀和的本质是“信息压缩”—— 把一段区间的统计信息,压缩成一个数值,方便后续快速查询。

而且,前缀和不仅能处理“和”,还能处理“差”、“出现次数”、“奇偶性”等抽象状态。

比如在平衡串中,我们并不关心具体有多少个LQ,只关心它们的相对数量差。这个差值的变化可以用前缀和来追踪。


✅ 总结

  • 前缀和的核心是:预处理 + 快速查询
  • 适用于多次查询同一数组区间的问题
  • 可以扩展到二维、多维、非数值型(如字符计数)
  • 关键在于定义合适的“前缀值”(如和、差、次数等)
  • 时间复杂度:预处理 $ O(n) $,每次查询 $ O(1) $

如果你也在刷算法题,不妨试试今天这三道题,用最直白的前缀和方法做一遍。
有时候,简单的预处理,也能带来巨大的效率提升。

欢迎在评论区贴出你的解法,我们一起交流进步!👇

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 0:12:22

交稿前一晚!8个AI论文平台测评:本科生毕业论文写作全攻略

在论文写作日益数字化的今天&#xff0c;越来越多的本科生开始借助AI工具提升效率、降低压力。然而面对市场上琳琅满目的AI论文平台&#xff0c;如何选择真正适合自己的工具成为一大难题。为此&#xff0c;我们基于2026年的实测数据与用户真实反馈&#xff0c;对多款主流AI论文…

作者头像 李华
网站建设 2026/4/10 22:17:47

基于STM32的智能健康手表设计

基于STM32的智能健康手表设计 第一章 智能健康手表硬件架构设计 基于STM32的智能健康手表硬件以“高精度监测低功耗运行”为核心目标&#xff0c;选用STM32L496ZGJ6作为主控芯片&#xff0c;该芯片搭载ARM Cortex-M4内核&#xff0c;集成硬件浮点运算单元&#xff08;FPU&#…

作者头像 李华
网站建设 2026/3/26 14:17:20

基于STM32的智能手环设计

基于STM32的智能手环设计 第一章 智能手环硬件架构设计 基于STM32的智能手环硬件设计以低功耗为核心原则&#xff0c;选用STM32L431CBT6作为主控芯片&#xff0c;该芯片搭载ARM Cortex-M4内核&#xff0c;支持多种低功耗模式&#xff0c;满足手环续航需求。硬件架构分为核心控制…

作者头像 李华
网站建设 2026/4/15 13:47:09

Kafka 消息不丢失:一次把话说清楚

一、Kafka 为啥会丢消息&#xff1f;先泼一盆冷水&#xff1a;Kafka 本身不保证消息 100% 不丢。丢不丢&#xff0c;取决于你怎么用它 &#x1f447;你要是 acks0&#xff0c;那就是“发出去就当成功”&#xff0c;消息随缘你要是自动提交 Offset&#xff0c;那就是“吃没吃不重…

作者头像 李华
网站建设 2026/3/25 16:25:58

基于微服务架构的安家租房平台vue房屋租赁带支付

目录微服务架构的安家租房平台&#xff08;Vue 支付集成&#xff09;摘要技术架构核心功能数据交互部署与扩展典型技术栈项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作微服务架构的安家租房平台&#xf…

作者头像 李华
网站建设 2026/4/15 13:43:18

【期货量化进阶】期货量化交易中的市场状态识别(实战方法)

一、前言 准确识别市场状态是量化交易成功的关键。不同市场状态需要不同的交易策略&#xff0c;识别市场状态可以帮助我们选择合适策略&#xff0c;提高交易效果。 本文将介绍&#xff1a; 市场状态类型状态识别方法状态转换分析状态应用策略实时状态监控 二、为什么选择天…

作者头像 李华