注意点
防止超时,在d[i]数组中存储第i个节点到起点的距离,从而d[n+1]存储的则是整个环的长度
s<e时,计算
顺时针的长度:d[s]-d[e]
逆时针的长度:d[n+1]-d[s]+d[e]
s>e时,则刚好相反
AC代码
#include<iostream>
using namespace std;
int main()
{
int n,m,s,e,d[100005]={};
cin>>n;
for(int i=1;i<=n;i++) cin>>d[i+1],d[i+1]+=d[i];
cin>>m;
for(int i=0;i<m;i++){
cin>>s>>e;
long long int dis1=0,dis2=0;
if(s<e){
dis1=d[e]-d[s];
dis2=d[n+1]-d[e]+d[s];
}
else{
dis1=d[s]-d[e];
dis2=d[n+1]-d[s]+d[e];
}
if(dis1>dis2) cout<<dis2<<endl;
else cout<<dis1<<endl;
}
return 0;
}