当前位置: 首页 > news >正文

【P8218 求区间和】一维前缀和入门完整题解博客

一、题目题意

给定长度为nnn的整数序列,再给出mmm次区间询问,每次给出区间左右端点l,rl,rl,r,输出区间[l,r][l,r][l,r]内所有数字的总和。

样例解读

输入:

4 4 3 2 1 2 1 4 2 3

序列:[4,3,2,1][4,3,2,1][4,3,2,1]

  1. 区间[1,4][1,4][1,4]4+3+2+1=104+3+2+1=104+3+2+1=10
  2. 区间[2,3][2,3][2,3]3+2=53+2=53+2=5

输出两行依次为10、510、5105

二、核心算法:一维前缀和

1. 前缀和定义

定义前缀和数组sss,其中s[i]s[i]s[i]代表原数组前iii项的总和:

s[i]=a1+a2+⋯+ai s[i] = a_1 + a_2 + \dots + a_is[i]=a1+a2++ai

递推公式:

s[0]=0,s[i]=s[i−1]+a[i] s[0]=0,\quad s[i] = s[i-1] + a[i]s[0]=0,s[i]=s[i1]+a[i]

2. 区间和计算公式

对于任意区间[l,r][l,r][l,r],区间总和等于「前rrr项和」减去「前l−1l-1l1项和」:

sum(l,r)=s[r]−s[l−1] sum(l,r) = s[r] - s[l-1]sum(l,r)=s[r]s[l1]

原理s[r]s[r]s[r]包含1∼r1\sim r1r全部数字,s[l−1]s[l-1]s[l1]包含1∼l−11\sim l-11l1全部数字,两者相减恰好剩下l∼rl\sim rlr的数字之和。

3. 算法优势

  1. 预处理仅需O(n)O(n)O(n)时间
  2. 每次区间查询仅O(1)O(1)O(1)常数时间
  3. 对比暴力每次循环累加O(n)O(n)O(n)查询,海量询问下效率提升巨大。

三、完整AC代码

#include<bits/stdc++.h>usingnamespacestd;intn,m;inta[100005],s[100005];intmain(){scanf("%d",&n);for(inti=1;i<=n;i++){scanf("%d",&a[i]);s[i]=s[i-1]+a[i];}scanf("%d",&m);for(inti=1;i<=m;i++){intl,r;scanf("%d%d",&l,&r);printf("%d\n",s[r]-s[l-1]);}return0;}

四、分步解题流程

步骤1:输入序列长度nnn,读入原数组aaa

循环从i=1i=1i=1nnn读取每个数字,同步计算前缀和数组sss

  • s[0]s[0]s[0]程序默认初始为0;
  • 每一步s[i]=s[i−1]+a[i]s[i] = s[i-1] + a[i]s[i]=s[i1]+a[i],完成预处理。

以样例数据演示前缀和数组生成:
a[1]=4, a[2]=3, a[3]=2, a[4]=1a[1]=4,\ a[2]=3,\ a[3]=2,\ a[4]=1a[1]=4,a[2]=3,a[3]=2,a[4]=1

s[0]=0s[0]=0s[0]=0

s[1]=s[0]+4=4s[1]=s[0]+4=4s[1]=s[0]+4=4

s[2]=s[1]+3=7s[2]=s[1]+3=7s[2]=s[1]+3=7

s[3]=s[2]+2=9s[3]=s[2]+2=9s[3]=s[2]+2=9

s[4]=s[3]+1=10s[4]=s[3]+1=10s[4]=s[3]+1=10

步骤2:输入询问次数mmm

循环处理每一组询问,每次读入区间端点l、rl、rlr

步骤3:套用公式计算区间和并输出

使用公式s[r]−s[l−1]s[r]-s[l-1]s[r]s[l1]快速得到答案:

  1. 询问1 41\ 414s[4]−s[0]=10−0=10s[4]-s[0] = 10-0=10s[4]s[0]=100=10
  2. 询问2 32\ 323s[3]−s[1]=9−4=5s[3]-s[1] = 9-4=5s[3]s[1]=94=5

五、代码逐段讲解

  1. 数组定义

    inta[100005],s[100005];

    数组开到100005,适配题目数据范围;下标从1开始,规避边界l=1l=1l=1l−1=0l-1=0l1=0的特殊判断。

  2. 前缀和预处理循环

    for(inti=1;i<=n;i++){scanf("%d",&a[i]);s[i]=s[i-1]+a[i];}

    边读入原数组,边递推计算前缀和,一次遍历完成预处理。

  3. 批量处理区间询问

    for(inti=1;i<=m;i++){intl,r;scanf("%d%d",&l,&r);printf("%d\n",s[r]-s[l-1]);}

    每次查询直接通过前缀和差值算出区间和,无需再次遍历原数组。

六、题型总结

  1. 适用场景:静态数组(无单点修改)、大量区间求和查询;
  2. 模板记忆点:前缀和递推s[i]=s[i−1]+a[i]s[i]=s[i-1]+a[i]s[i]=s[i1]+a[i],区间公式s[r]−s[l−1]s[r]-s[l-1]s[r]s[l1]
  3. 拓展延伸:二维前缀和、差分(支持区间修改+单点查询)是该知识点的延伸进阶内容。
http://www.jsqmd.com/news/1165367/

相关文章:

  • 深圳积家回收价格查询和各大回收平台实测排行(2026年7月最新数据) - 积家官方售后服务中心
  • STM32 SPI 模式配置实战:W25Q64 Flash 读写时序与 CPOL/CPHA 寄存器详解
  • 反函数求解3大易错点解析:从分段函数到复合函数定义域判定
  • TMC7300与PIC18F86J16构建高效有刷直流电机控制系统
  • C++集成YOLOv11-CLS图像分类模型:基于ONNX Runtime的部署实战
  • 面向海量视频数据的智能存储优化技术研究:AI驱动的视频空间压缩方法与应用探索
  • Python OpenCV 图像处理:阈值分割详解与实战
  • 硬件工程师工具网站2024精选:9大场景30+站点实测与效率对比
  • 梳理一下做一个前端项目需要的点
  • DS18B20 多点测温系统设计:单总线挂载 3 个传感器与地址寻址实战
  • Cesium 雷达扫描 3 种方案对比:Entity Wall vs Primitive vs PostProcessStage 性能实测
  • 2026桃心云手机深度实测 内置AI安卓云机全功能测评
  • Unity游戏实时NPC语音生成:基于IndexTTS的本地化集成方案
  • 适合孵化 OPC 项目的 AI 编码工具:2026 年选型指南与实践评测
  • 行业内专业的工业电源厂商
  • 2026年7月最新哈尔滨浪琴官方售后服务热线与网点地址查询 - 浪琴官方售后服务中心
  • 面向俄 CRPT 监管的诚实标签全链路采集关联系统技术方案 —— 兴通一体化软硬件实现赋码采集与合规文件输出
  • 计算机毕业设计之基于springboot艺术品拍卖网站的设计与实现
  • 特征选择与降维实战:5种算法在鸢尾花数据集上的性能对比
  • 英雄联盟Akari助手:5分钟快速上手的免费智能游戏效率工具终极指南
  • 企业微信私域运营全攻略:从 0 到 1 搭建高效客户运营体系
  • 主流国产数据库:体验便利度
  • 3种高效方法破解Navicat试用限制:macOS数据库开发者的智能解决方案
  • Obsidian插件全指南:34款神器打造高效知识库
  • 【小白也能轻松玩转龙虾】虾壳云一键部署极速安装,数分钟完成 OpenClaw 配置(附最新安装包)
  • 基于火山引擎大模型的智能穿搭系统:技术架构与工程实践
  • 合同管理进入“自动驾驶”时代:道本×DeepSeek的三重穿透
  • 【单片机毕业设计】 基于 51 单片机的 PM2.5 粉尘监测与声光报警装置设计 ,基于 STM32 单片机的室内 PM2.5 检测预警系统设计(024501)
  • Pwn 入门实战:BUUCTF 前 10 题栈溢出漏洞利用与 payload 构造精讲(附 10 个完整 EXP)
  • VS Code + Codex 插件侧栏不显示、反复提示窗口未响应的解决思路