AcWing 1530. 最短距离
原题链接
简单
作者:
aac
,
2024-11-25 20:29:43
,
所有人可见
,
阅读 1
N = int(1e5 + 10)
"""
d[i]定义为从i到i + 1的距离
所以i到j的一个距离为d[i] + d[i + 1] + ... + d[j - 1]
i到j的最短距离为min(d[i] + d[i + 1] + ... + d[j - 1],d[1] + d[2] + ... + d[n] - (d[i] + d[i + 1] + ... + d[j - 1]))
快速地求某一段区间的和可以用前缀和
优化为min(s[j - 1] - s[i - 1],s[n] - s[j - 1] + s[i - 1])
"""
d = [0] * N
s = [0] * N
n,*li = map(int,input().split())
for i,x in enumerate(li,start = 1):
d[i] = x
s[i] += s[i - 1] + x
m = int(input())
while m:
m -= 1
x1,x2 = map(int,input().split())
if x1 > x2:
x1,x2 = x2,x1 # 使x1总是最小的
ans = min(s[x2 - 1] - s[x1 - 1],s[n] - s[x2 - 1] + s[x1 - 1])
print(ans)