按照B站上讲的题解来就是了,但是我不明白的一点,当bad.size<=6时,我不交换(好,好)的时候,就过不了。和B站讲的有点不一样

#include<bits/stdc++.h>

using namespace std;

template<class T>
void read(T &num) {
    T x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9') {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9') {
        x = 10 * x + ch - '0';
        ch = getchar();
    }
    num = x * f;
}

template<typename T, typename ...Arg>
void read(T &x, Arg &...arg) {
    read(x), read(arg...);
}

#define all(v) v.begin(),v.end()
#define eu(v) v.erase(unique(all(v)), v.end())

int n, k;

bool check(vector<int> &v) {
    for(int i = 0; i < n; ++i) {
        int num1 = v[i];
        int num2 = v[(i + 1) % n];
        if(abs(num1 - num2) > k)return false;
    }
    return true;
}

void solve() {
    read(n, k);
    vector<int> v(n), st(n, 0);
    for(int i = 0; i < n; ++i)read(v[i]);

    vector<int> bad, good;
    for(int i = 0; i < n; ++i) {
        int num1 = v[i];
        int num2 = v[(i + 1) % n];
        if(abs(num1 - num2) > k) {
            bad.emplace_back(i);
            bad.emplace_back((i + 1) % n);
            st[i] = st[(i + 1) % n] = 1;
        }
    }
    sort(all(bad)), eu(bad);
    for(int i = 0; i < n; ++i)
        if(!st[i])good.emplace_back(i);

    if(bad.empty()) {
        ::printf("0\n");
        return;
    }
    else if(bad.size() > 12) {
        ::printf("-1\n");
        return;
    }
    else if(bad.size() > 6) {
        vector<int> back = v;
        for(auto i1 : bad)
            for(auto i2 : bad)
                for(auto i3 : bad)
                    for(auto i4 : bad) {
                        swap(v[i1], v[i2]), swap(v[i3], v[i4]);
                        if(check(v)) {
                            ::printf("2\n");
                            ::printf("%d %d\n%d %d\n", i1 + 1, i2 + 1, i3 + 1, i4 + 1);
                            return;
                        }
                        v = back;
                    }

        for(auto i1 : bad)
            for(auto i2 : bad)
                for(auto i3 : bad)
                    for(auto i4 : good) {
                        swap(v[i1], v[i2]), swap(v[i3], v[i4]);
                        if(check(v)) {
                            ::printf("2\n");
                            ::printf("%d %d\n%d %d\n", i1 + 1, i2 + 1, i3 + 1, i4 + 1);
                            return;
                        }
                        v = back;
                    }
    }
    else {
        vector<int> back = v;

        for(auto i1 : bad)
            for(auto i2 : bad)
                for(auto i3 : bad)
                    for(auto i4 : bad) {
                        swap(v[i1], v[i2]), swap(v[i3], v[i4]);
                        if(check(v)) {
                            ::printf("2\n");
                            ::printf("%d %d\n%d %d\n", i1 + 1, i2 + 1, i3 + 1, i4 + 1);
                            return;
                        }
                        v = back;
                    }

        for(auto i1 : bad)
            for(auto i2 : bad)
                for(auto i3 : bad)
                    for(auto i4 : good) {
                        swap(v[i1], v[i2]), swap(v[i3], v[i4]);
                        if(check(v)) {
                            ::printf("2\n");
                            ::printf("%d %d\n%d %d\n", i1 + 1, i2 + 1, i3 + 1, i4 + 1);
                            return;
                        }
                        v = back;
                    }

        for(auto i1 : bad)
            for(auto i2 : good)
                for(auto i3 : bad)
                    for(auto i4 : good) {
                        swap(v[i1], v[i2]), swap(v[i3], v[i4]);
                        if(check(v)) {
                            ::printf("2\n");
                            ::printf("%d %d\n%d %d\n", i1 + 1, i2 + 1, i3 + 1, i4 + 1);
                            return;
                        }
                        v = back;
                    }

        for(auto i1 : good)
            for(auto i2 : good)
                for(auto i3 : bad)
                    for(auto i4 : good) {
                        swap(v[i1], v[i2]), swap(v[i3], v[i4]);
                        if(check(v)) {
                            ::printf("2\n");
                            ::printf("%d %d\n%d %d\n", i1 + 1, i2 + 1, i3 + 1, i4 + 1);
                            return;
                        }
                        v = back;
                    }

        for(auto i1 : good)
            for(auto i2 : good)
                for(auto i3 : bad)
                    for(auto i4 : bad) {
                        swap(v[i1], v[i2]), swap(v[i3], v[i4]);
                        if(check(v)) {
                            ::printf("2\n");
                            ::printf("%d %d\n%d %d\n", i1 + 1, i2 + 1, i3 + 1, i4 + 1);
                            return;
                        }
                        v = back;
                    }

        for(auto i1 : good)
            for(auto i2 : good)
                for(auto i3 : good)
                    for(auto i4 : good) {
                        swap(v[i1], v[i2]), swap(v[i3], v[i4]);
                        if(check(v)) {
                            ::printf("2\n");
                            ::printf("%d %d\n%d %d\n", i1 + 1, i2 + 1, i3 + 1, i4 + 1);
                            return;
                        }
                        v = back;
                    }
    }

    ::printf("-1\n");
}

signed main() {
#ifndef ONLINE_JUDGE
    setbuf(stdout, nullptr);
    freopen("../input.txt", "r", stdin);
#endif
    int T = 1;
    read(T);
    while(T--)solve();
    return 0;
}