思路:
- 求前缀和:preSum[i]=preSum[i-1]+arr[i],arr的下标从1开始
- 用前缀和[l,r]:preSum[r]-preSum[l-1]
c++
用时 150ms 左右
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100010;
int preSum[N];
int n,m;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
preSum[i]=preSum[i-1]+x;
}
while(m--){
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",preSum[r]-preSum[l-1]);
}
return 0;
}
java
用时 1835ms 左右
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out));
String[] line1=br.readLine().split(" ");
int n=Integer.parseInt(line1[0]),m=Integer.parseInt(line1[1]);
String[] line2=br.readLine().split(" ");
//求前缀和
int[] preSum=new int[n+10];
for(int i=1;i<=n;i++) preSum[i]=preSum[i-1]+Integer.parseInt(line2[i-1]);
//用前缀和
while(m>0){
m--;
String[] line3=br.readLine().split(" ");
int l=Integer.parseInt(line3[0]),r=Integer.parseInt(line3[1]);
pw.println(preSum[r]-preSum[l-1]);
}
pw.flush();
}
}
python
用时 2670 ms左右
n,m=map(int,input().split())
line=input()
lst=[int(i) for i in line.split()]
#求前缀和
preSum=[0,]
for i in range(1,n+1):
preSum.append(preSum[i-1]+lst[i-1])
#用前缀和
for i in range(m):
l,r=map(int,input().split())
print(preSum[r]-preSum[l-1])