![](https://i-blog.csdnimg.cn/direct/d944112afc75472a918f4e30a6bbca1f.png)
![](https://i-blog.csdnimg.cn/direct/262cef2b803545b39133e49c4d98ae1f.png)
思路:
1.利用前缀和数组s保存每个加油站与1号加油站的距离
什么是前缀和?
前缀和数组s[i]是原数组a中前i个数的累加
例如:s[3]=a[1]+a[2]+a[3]
cpp
#include <bits/stdc++.h>
using namespace std;
int n,a[100005],q;//n:加油站的数量 a:原数组,代表每个加油站与下个加油站的距离 q:q次查询
long long s[100005];//s:前缀和数组,代表每个加油站与1号加油站的距离
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
s[i]=s[i-1]+a[i];//求出前缀和数组
}
cin>>q;
for(int i=1;i<=q;i++){
long long l,r,a,b;
cin>>l>>r;
a=s[r-1]-s[l-1];//利用前缀和数组求出l号加油站到r号加油站的距离
b=s[n]-a;//由于这是一个环形,所以还有逆时针的情况
if(a<b)//求出a(顺时针)和b(逆时针)中的最短距离
cout << a << endl;
else
cout << b << endl;
}
return 0;
}