思路:
1、以dis[i]表示1号结点顺时针方向到达i号结点的距离,sum表示一圈的总距离。题目要求的就是dis(left-right)和sum-dis(left-right)中的最小值。
2、dis[i]记录从第1个结点到第i个结点的距离。
注意:
1、查询的两个编号left和right可能left>right
2、没有预处理dis数组会超时
#include<iostream>
using namespace std;
int main()
{
int k,d[100005],m,l,r,sum=0;
cin>>k;
for(int i=1;i<=k;i++)
{
cin>>d[i];
}
d[0] = 0;
for(int i=1;i<=k;i++)//dis数组记录从1号位开始到第i位的距离(顺时针)
{
sum += d[i];
d[i] = sum;
}
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>l>>r;
if(l>r)
swap(l,r);
int temp = d[r-1]-d[l-1];
if(temp < sum-temp)//比较顺时针和逆时针距离大小选出最小值
cout << temp << endl;
else
cout << sum-temp << endl;
}
return 0;
}