简单分类讨论+构造。
首先分析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;
}

京公网安备 11010502036488号