news 2026/5/1 6:13:29

算法学习日记 | 前缀和

作者头像

张小明

前端开发工程师

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/23 18:43:09

如何使用1688官方API进行订单同步?

一、前置准备&#xff08;必须完成&#xff09; 1. 开放平台基础配置 注册 / 登录&#xff1a;1688 开放平台&#xff0c;完成企业实名认证&#xff08;个人账号无订单接口权限&#xff09;。创建应用&#xff1a;在「应用管理」创建应用&#xff0c;获取app_key&#xff08;…

作者头像 李华
网站建设 2026/4/30 8:07:57

非球面透镜背后的焦点研究

摘要高功率激光二极管经常在两个方向上表现出不对称的发散和散光。此案例在VirtualLab Fusion中研究了激光二极管首先被物镜准直&#xff0c;然后被非球面透镜聚焦后焦点区域的场的演变。与没有散光的情况相比&#xff0c;散光对其焦点区域的场的影响被清楚地呈现出来。建模任务…

作者头像 李华
网站建设 2026/4/30 14:05:13

乡村地区无人机医药配送路径规划与优化Matlab仿真

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…

作者头像 李华
网站建设 2026/5/1 7:20:20

PCB阻抗测试国内、国际标准参考

在高速数字电路和射频应用领域&#xff0c;印刷电路板(PCB)的阻抗控制至关重要。阻抗匹配不良会导致信号反射、波形畸变、时序抖动等一系列信号完整性问题&#xff0c;直接影响电子设备的性能和可靠性。Bamtone H系列TDR阻抗测试仪国际主流PCB阻抗测试标准&#xff1a;IPC-TM-6…

作者头像 李华
网站建设 2026/4/26 23:21:01

便携式多功能比赛计时记分系统设计

便携式多功能比赛计时记分系统设计 第一章 系统整体设计 便携式多功能比赛计时记分系统以“轻量化、多场景适配、易操作”为核心设计目标&#xff0c;面向校园赛事、小型体育场馆等场景&#xff0c;支持篮球、羽毛球、乒乓球、拔河等十余种常见赛事的计时记分需求。系统整体采用…

作者头像 李华