简单分类讨论+构造。

首先分析NO的情况,易知,在n=2以及n/2!=0(奇数与偶数的差至少为1,要使前后相等,可以看成如何操作n/2个1使得它们通过1-1+1...的计算使结果为0。易知,n/2为奇数时无法为0)的情况下无法构造数组。

再考虑YES。(为了方便说明,设数组为a)

首先处理偶数,最简为2,4,6,8...(复杂的不考虑),对于奇数a[n/2+i],如果使它小于a[i](如2,1),则这两个数的差为-1,

反之为1,把每对a[n/2+i]-a[i]简化为sum=1+(-1)+...,要使sum=0,就要使-1与1相等,即有n/4个奇数a[n/2+i]小于偶数a[i],其余的奇数大于偶数。在输出第n/4个奇数后,奇数再加2。代码如下:

#include <cstdio>
#include <iostream>
#include <sstream>
using namespace std;
int main() {
    int t;
    scanf("%d",&t);
    stringstream ss;  //字符流快速输出
    for(;t>0;t--){
        int n;
        scanf("%d",&n);
        if(n==2)ss<<"NO"<<"\n";
        else if((n/2)%2==1)ss<<"NO"<<"\n";
        else if((n/2)%2==0){
            ss<<"YES\n";
            int odd=1,even=2;
            for(int i=0;i<n/2;i++){
                ss<<even<<" ";
                even+=2;
            }
            for(int i=0;i<n/4;i++){
                ss<<odd<<" ";
                odd+=2;
            }
            odd+=2;  //分界处奇数加2
            for(int i=0;i<n/4;i++){
                ss<<odd<<" ";
                odd+=2;
            }
            ss<<"\n";
        }
    }
    printf("%s\n",ss.str().c_str());
    return 0;
}