构造数列【牛客tracker  每日一题】

构造数列

时间限制:1秒 空间限制:256M

网页链接

牛客tracker

牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每日有题做,丰盈牛币日益多!

题目描述

给定一个正整数n nn,保证n nn为偶数。请构造一个长度为n nn的整数数组 {a 1 , a 2 , … , a n a_1,a_2,…,a_na1,a2,,an} ,使其满足如下条件:

如果存在满足条件的数组,请给出任意一组答案;否则,请说明不存在。

名词解释

输入描述:

每个测试文件均包含多组测试数据。第一行输入一个整数T ( 1 ≦ T ≦ 10 4 ) T(1≦T≦10^4)T(1T104)代表数据组数,每组测试数据描述如下:

输出描述:

对于每一组测试数据:

示例1

输入:

5 2 4 6 8 10

输出:

NO YES 2 4 1 5 NO YES 2 4 6 8 1 3 5 11 NO

示例2

输入:

2 4 2

输出:

YES 2 4 1 5 NO

说明:

在第一个样例中:

解题思路

首先判断n / 2 n/2n/2是否为奇数,若是则输出N O NONO(前半部分偶数之和必为偶数,后半部分奇数个数为奇数时和为奇数,无法相等);若n / 2 n/2n/2为偶数则可构造数组,前n / 2 n/2n/2个元素取连续不同偶数( 2 、 4 、 … 、 n ) (2、4、…、n)24n,保证均为偶数且互不相同,前半部分和为( 2 + n ) ∗ n / 4 (2+n)*n/4(2+n)n/4;后半部分前n / 2 − 1 n/2-1n/21个元素取连续不同奇数( 1 、 3 、 … 、 n − 1 ) (1、3、…、n-1)13n1,最后一个奇数调整为( 2 ∗ ( n / 2 ) − 1 ) + n / 2 (2*(n/2)-1)+n/2(2(n/2)1)+n/2,使后半部分和等于前半部分,且所有元素互不相同;该方法通过奇偶性分析快速判定是否可构造,构造时用连续奇偶数列保证唯一性,时间复杂度O ( n ) O(n)O(n),适配T TT1 e 4 、 ∑ n ≤ 2 e 5 1e4、∑n≤2e51e4n2e5的规模,高效输出符合条件的数组或判定不存在。

代码内容

#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefpair<ll,ll>pii;constll p=1e9+7;constll N=2e5+10;voidsolve(){ll n;cin>>n;if((n/2)%2==1){cout<<"NO\n";return;}vector<ll>a(n);cout<<"YES\n";for(ll i=1;i<=n/2;++i)cout<<i*2<<" ";for(ll i=1;i<=n/2;++i){if(i!=n/2)cout<<i*2-1<<" ";elsecout<<2*i-1+n/2<<"\n";}}intmain(){ll t;cin>>t;while(t--)solve();return0;}