首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【题解】求区间和

【题解】求区间和

作者头像
fishhh
发布于 2022-08-30 19:57:20
发布于 2022-08-30 19:57:20
9130
举报
文章被收录于专栏:OI算法学习笔记OI算法学习笔记

题目描述

​

给定 n 个正整数组成的数列 a1,a2,⋯ ,an 和 m 个区间

分别求这 m 个区间的区间和。对于所有测试数据,

​

输入格式

共 n+m+2 行。

第一行,为一个正整数 n 。

第二行,为 n 个正整数 a1,a2,⋯ ,an

第三行,为一个正整数 m 。

第 4 到第 n+m+2 行,每行为两个正整数

,满足

​

输出格式

共 m 行。

第 i 行为第 i 组答案的询问。

输入输出样例

输入 #1

代码语言:javascript
复制
4
4 3 2 1
2
1 4
2 3

输出 #1

代码语言:javascript
复制
10
5

说明/提示

样例解释:第 1 到第 4 个数加起来和为 10。第 2 个数到第 3 个数加起来和为5。

对于 50% 的数据:n,m≤1000;

对于100% 的数据:

​

题目分析

题目需要我们求出m个区间的和,现在已知每次询问的区间边界l和r。若采用暴力的方式,复杂度为O(nm) 。此时,由于范围的问题会超时。

需要采用更快的方式进行处理。可以采用前缀和的思想,先提前进行预处理。

​

​

代码实现

代码语言:javascript
复制
#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e5+5;
int a[N],sum[N];
int main(){
	int n,m,l,r;
	cin>>n;
	for(int i=1;i<=n;i++){//输入n个元素
		cin>>a[i];
		sum[i]=sum[i-1]+a[i];//维护前缀和,求出a[1]~a[i]的总和
	}
	cin>>m;
	while(m--){//重复m次
		cin>>l>>r;//输入询问的区间
		cout<<sum[r]-sum[l-1]<<endl;//求出a[l]~a[r]的总和
	}
	return 0;
}

Q.E.D.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 题目描述
  • 输入格式
  • 输出格式
  • 输入输出样例
  • 说明/提示
  • 题目分析
  • 代码实现
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档