题目
原题链接
题目描述
给定 n 个正整数组成的数列 a1,a2,⋯,an 和 m 个区间[li,ri],分别求这 m 个区间的区间和。对于所有测试数据,n,m≤105,ai≤104
输入格式
第一行,为一个正整数 n 。
第二行,为 n 个正整数 a1,a2,⋯,an
第三行,为一个正整数 m 。
接下来 m 行,每行为两个正整数 li,ri ,满足1≤li≤ri≤n
输出格式
共 m 行。
第 i 行为第 i 组答案的询问。
输入输出样例
输入
4 4 3 2 1 2 1 4 2 3
输出
10 5
说明/提示
样例解释:第 1 到第 4 个数加起来和为 10。第 2 个数到第 3 个数加起来和为5。
对于 50% 的数据:n,m≤1000 ;
对于100% 的数据:n.m≤105,ai≤104;
思路
如果采用暴力的方法时间复杂度为(n*m),容易TLM;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=1e5+10;
int p[M];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n;
p[0]=0;
for(int i=1;i<=n;i++)
cin>>p[i];
cin>>m;
while(m--){
int a,b;
cin>>a>>b;
int sum=0;
for(int i=a;i<=b;i++){
sum+=p[i];
}
cout<<sum<<endl;
}
return 0;
}
洛谷的提交结果
由题目可知这是一道前缀和的模板题,数据的范围也比较低。可以直接套用前缀和的模板,时间复杂度为(n);可以很好的通过所有检测案例。
代码
#include<bits/stdc++.h>//c++的头文件
using namespace std;
typedef long long ll;
const int M=1e5+10;
int p[M];//前缀和数组
int main(){
ios::sync_with_stdio(false);//解除对cin和cout的速度限制
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n;
p[0]=0;//预置条件
for(int i=1;i<=n;i++){
cin>>p[i];
p[i]+=p[i-1];
}
cin>>m;
while(m--){
int a,b;
cin>>a>>b;
cout<<p[b]-p[a-1]<<endl;//a-1表示包含a
}
return 0;
}
提交结果