题意简述

数轴上有 NN 个点,一开始在 00 位置上,需要去 NN 个点(顺序从 00 号点按顺序走完 NN 个点),最后回到 00 位置。

对于 i=1,2,,Ni=1, 2, \ldots, N 分别输出不需要去 ii 号点的最小路程。

思路

又是一道水题。。。

首先,我们考虑不走 ii 原路径会发生什么变化,

显然,会变为 12i1i+1i+2N1 \to 2 \to \cdots \to i-1 \to i + 1 \to i + 2 \to \cdots \to N

他和原本的路径的区别是:减去了 i1ii - 1 \to iii+1i \to i + 1 的距离,加上了 i1i+1i - 1 \to i+1 的距离。

知道了这一点,那就很好做了,只需要先算出全部都走的时间,然后如上计算便可得到。

注: i,ji , j 两点的距离为 ij|i - j| , 小心 ana_n

代码

#include <bits/stdc++.h>
using namespace std;

#define I_Love_lxl_Forever cout

int N , Num[100010];
int Sum_Dist;

int main() {
    ios::sync_with_stdio(false);
    cin >> N;
    for(int i = 1; i <= N; i++) {
        cin >> Num[i];
    }
    for(int i = 1; i <= N + 1; i++) {
        Sum_Dist += abs(Num[i] - Num[i - 1]);
    }
    for(int i = 1; i <= N; i++) {
        cout << Sum_Dist - abs(Num[i] - Num[i - 1]) - abs(Num[i] - Num[i + 1]) + abs(Num[i - 1] -Num[i + 1]) <<endl;
    }
    return 0;
}