题意:
n个点围成一个环,给出相邻两点的距离,Q次询问,每次询问两点间的最短距离。
思路:
以第一个点为起点,计算每个点顺时针到第一个点的距离,以及每个点逆时针到第一个点的距离,询问的时候比较两个点的顺时针距离差和顺逆和,取最小值即可。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAX_N = 1000000;
int a[MAX_N];
int n, q, x, y;
int pre[MAX_N], post[MAX_N];
int main() {
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
pre[0] = 0;
for (int i = 1; i < n; i++) {
pre[i] = pre[i-1] + a[i-1];
}
post[0] = 0;
post[n-1] = a[n-1];
for (int i = n-2; i > 0; i--) {
post[i] = post[i+1] + a[i];
}
scanf("%d", &q);
while (q--) {
scanf("%d %d", &x, &y); if (x > y) swap(x, y); x--; y--;
printf("%d\n", min(abs(pre[y]-pre[x]), abs(pre[x]+post[y])));
}
return 0;
}