这是一道前缀和的基础题。
首先,对于1e6的访问次数,如果每次都使用for循环累加l~r内的数,时间复杂度为O(n^2),于是我们想到要使用(a[i]-a[j-1])表示[j,i]这个区间内的和,只需要在输入的时候预处理数组a就可以了。注意定义数组时要使长度为n+1,防止j=1时越界访问,于是代码如下:
#include <cstdio>
#include <iostream>
#include <bits/stdc++.h>
#include <sstream>
#include <vector>
using namespace std;
int main() {
int n,q;
scanf("%d%d",&n,&q);
vector<long long>a(n+1,0);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
a[i]+=a[i-1];
}
stringstream ss; //使用字符串流输出更快
for(int i=0;i<q;i++){
int x,y;
scanf("%d%d",&x,&y);
ss<<a[y]-a[x-1]<<"\n";
}
printf("%s",ss.str().c_str());
return 0;
}

京公网安备 11010502036488号