首先进行预处理,定义一个数组a[N]、s[N],s[i]表示a数组中前i个数的和
求前缀和操作:
const int N = 1e5+10;
int a[N],s[N];
for(int i=1;i<=n;i++)
{
s[i]=s[i-1]+a[i];
}
查询操作:
int l,r;
cin>>l>>r;
cout<<s[r]-s[l-1]<<endl;
原理:
s[r]=a[1]+a[2]+......+a[l-1]+a[l]+a[l+1]+......+a[r]
s[l-1]=a[1]+a[2]+......+ a[l-1]
s[r]-s[l-r]=a[l]+a[l+1]+......+ a[r]
故区间[l,r]的区间和为s[r]-s[l-r]
参考代码如下:
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N],s[N];
int main()
{
int n,m;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
cin>>m;
while(m--)
{
int l,r;
cin>>l>>r;
cout<<s[r]-s[l-1]<<endl;
}
return 0;
}