赛时不会做。知道3个数字时, k 可以等于第二小的,但是没办法推广了。

比如: 5,3,2 k = 2 的时候:

5,3,2
2,3,5
2,5,3
5,2,3

下面不会推广了。麻了。想了很多的错误答案。

比如去找第二小的逆序对,其实只是观察到 3 个数字时这种的是逆序对,然后又是第二小的作为答案,就直接当成结论做了。WA。反正也不知道该咋做,就瞎猜了,樂。

标答

任意三元组 (Max, Min, p),当 k = max(Max - p, p - Min) 的时候。这时候 p 就可以换到任意一个位置。三元组可以以任意一个顺序排列。

考虑有很多个 p: p1, p2, … pn。当 k = min(max(Max - p1, p1- Min), max(Max - p2, p2 - Min) …) 时,可以构造出任意一种排列方法。

因此,对于所有不在有序后位置的元素,也就是 a[i] != sort(a)[i]。都当做 p,然后去找到最小的 k。

Code

#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve() {
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    auto b = a;
    sort(b.begin(), b.end());z
    if (a == b) {
        cout << -1 << endl;return;
    }
    int Min = b[0], Max = b[n-1];
    vector<int> temp;
    for (int i = 0; i < n; i++) {
        if (a[i] != b[i]) temp.push_back(b[i]);
    }
    int ans = LONG_LONG_MAX;
    for (auto v: temp) {
        ans = min(ans, max(v - Min, Max - v));
    }
    cout << ans << endl;
}
signed main() {
    int T;
    cin >> T;
    while (T--) {
        solve();
    }
}