解法一:前缀和

以第一个点为起点,沿着一个方向,计算前缀和得到坐标和整个环的长度,然后就可以得到任意两个点沿两个方向的距离。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main() {
  4. ios::sync_with_stdio(false);
  5. cin.tie(0);
  6. int N;
  7. cin >> N;
  8. int sum[N + 1];
  9. sum[1] = 0;
  10. for (int i = 2; i <= N; ++i) {
  11. cin >> sum[i];
  12. sum[i] += sum[i - 1];
  13. }
  14. int total;
  15. cin >> total;
  16. total += sum[N];
  17. int M, x, y, dis1, dis2;
  18. cin >> M;
  19. for (int i = 0; i < M; ++i) {
  20. cin >> x >> y;
  21. dis1 = abs(sum[x] - sum[y]);
  22. dis2 = total - dis1;
  23. cout << min(dis1, dis2) << "\n";
  24. }
  25. }