题目链接
很容易想到用前缀和,想记录一下如果把前缀和数组sum[i]理解为1号结点到i+1结点的距离,这样sum[N]就是一圈的距离,相求dis(i,j)就是tmp=sum[j-1]-sum[i-1]与sum[N]-tmp两者小的那个
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int dis[100005];
int sum[100005]={0};
int main(){
int N;
cin >> N;
for(int i=1;i<=N;i++)
scanf("%d",&dis[i]);
//采用前缀和
sum[0]=0;
for(int i=1;i<=N;i++){
sum[i]=sum[i-1]+dis[i];
}
int M;
cin >> M;
for(int k=0;k<M;k++){
int i,j;
cin >> i >> j;
if(i>j) swap(i,j);
int ans1=sum[j-1]-sum[i-1];
int ans2=sum[i-1]+sum[N-1]-sum[j-1]+dis[N];//直接求,或者拿总距离减
cout << min(ans1,sum[N]-ans1) << endl;
}
return 0;
}