根据题意,首先考虑一下输出“NO”的情况:
由于前n/2个数字是偶数,后n/2个数字是奇数,我们发现若n/2是奇数,那么n/2个奇数相加也是奇数,而前面n/2个偶数相加一定是偶数,不满足题目对数组a的第三个条件即前 n/2 个数的元素之和等于后 n/2个数的元素之和,因此此时一定无法找到满足题意的数组。
构造输出“YES”的情况:
由于第四个条件要求a[i]不能重复,参考题目样例的构造方法,那么我们可以构造形如“2 4 6 ... n 1 3 5 ... n-3 n-1”,但是这样不满足题目的第三个要求,于是,我们考虑把前n/2个数与后n/2个数的差值全加到最后一个数字上即可(显然最后一个数加上某个偶数也不会破坏a[i]的其他条件),而且我们发现这个差值刚好是n/2(因为第i个数和第i+n/2个数都差1,一共有n/2对,1<=i<=n/2)。
#include <iostream>
using i64 = long long;
void solve(){
int n;
std::cin >> n;
if((n/2)&1){//判断n/2是否为奇数
std::cout << "NO\n";
return;
}
std::cout << "YES\n";
//输出 2 4 ... n
for(int i = 1; i <= n/2; i++){
std::cout << i*2 << " ";
}
//输出 1 3 ... n-3 (n-1+n/2)
for(int i = 1; i <= n/2; i++){
if(i != n/2){
std::cout << i*2-1 << " ";
}else{
std::cout << i*2-1+n/2 << "\n";
}
}
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int T = 1;
std::cin >> T;
for(; T--;){
solve();
}
}

京公网安备 11010502036488号