

规律:,发现①环形的总长度是可求的②A到B之间的距离等于(A到0距离)减去(B到0距离)③任意节点到0的距离都可以在输入时求出。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const double pi=acos(-1.0);
const double eps=1e-8;
const int maxn=100005;
int a[maxn];
ll sum[maxn];
ll maxx;
int main()
{
int n;
scanf("%d",&n);
maxx=0;
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
maxx+=a[i];
}
int m;
scanf("%d",&m);
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
ll ans=0;
if(x<y)
{
ll ans1=0;
ll ans2=0;
ans1=sum[y-1]-sum[x-1];
ans2=sum[x-1]+maxx-sum[y-1];
ans=min(ans1,ans2);
}
else
{
ll ans1=0;
ll ans2=0;
ans1=sum[y-1]+maxx-sum[x-1];
ans2=sum[x-1]-sum[y-1];
ans=min(ans1,ans2);
}
printf("%lld\n",ans);
}
}

本文介绍了一种计算环形路径中两点间最短距离的算法,利用预处理技术加速查询过程,适用于需要频繁查询不同起点终点的情况。通过记录每个节点到起点的距离并计算环的总长,能够高效得出两种可能路径中的较短者。
5万+

被折叠的 条评论
为什么被折叠?



