#include <iostream>
#include <vector>

using namespace std;

// 判断是否是连续严格递增数列
bool isIncreasing(vector<int>& s) {
    int n = s.size();
    for (int i = 0; i < n - 1; i++) {
        if (s[i + 1] - s[i] != 1) {
            return false;
        }
    }
    return true;
}

int main() {
    int T;
    cin >> T;
    while (T--) {
        int N;
        cin >> N;
        if (N % 2 != 0) {
            cout << "N0" << endl;
            continue;
        }
        vector<int> p(N);
        // 构造一个神奇的排列
        for (int i = 0; i < N; i += 2) {
            p[i] = N - i;
        }
        for (int i = 1; i < N; i += 2) {
            p[i] = i;
        }
        // 计算数组s
        vector<int> s(N / 2);
        for (int i = 0; i < N / 2; i++) {
            s[i] = p[2 * i] + p[2 * i + 1];
        }
        if (isIncreasing(s)) {
            cout << "YE5" << endl;
            for (int i = 0; i < N; i++) {
                cout << p[i] << " ";
            }
            cout << endl;
        } else {
            cout << "N0" << endl;
        }
    }
    return 0;
}

该算法的思路是先构造一个满足题意的排列,然后判断排列中的数组s是否是连续严格递增数列。算法的时间复杂度为O(N)

# 神奇的排列## 题目描述对于一个长度为 $2n$ 的排列 $p_1p_2p_2n$定义数组 $s$ 为 $p$ 中两两分组以后每个组的数字之和即 $s_i=p_2i-1+p_2i$可以发现 $s$ 的长度为 $n$。若 $s$ 是一个连续严格递增数列则我们称排列 $p$ 为一个神奇的排列。现在我们给定一个数字 $n$ 请给出一个长度为 $2n$ 可能的神奇的排列 $p$。## 输入格式第一行一

原文地址: https://www.cveoy.top/t/topic/iG4E 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录