思路:思维题,首先有一个特判可以注意到:令k = n // 2,如果此时k是奇数,那么数组左边是奇数个偶数和,结果为偶数;数组右边是奇数个奇数和,结果为奇数。因此,左右两边的和不可能相等,直接输出"NO"即可
然后我们就可以往左边填偶数,从2开始填,形成一个等差数列,其求和公式为k * (1 + k),结果令为s。右边就可以从1开始填奇数,然后s减去对应的奇数,这样做的好处就是每次填的奇数都比对应位置的偶数少1,那么我们只需要填k - 1位,最终第k位就填剩下的s即可,它必然为奇数。并且由于题目说了n的规模远小于ai的规模,所以说这样填不会超过ai的最大值,最终拼接起来,输出"YES"和ans数组即可
代码:
import sys
input = lambda: sys.stdin.readline().strip()
import math
inf = 10 ** 18
def I():
return input()
def II():
return int(input())
def MII():
return map(int, input().split())
def GMI():
return map(lambda x: int(x) - 1, input().split())
def LI():
return input().split()
def LII():
return list(map(int, input().split()))
def LFI():
return list(map(float, input().split()))
fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))
'''
'''
def solve():
n = II()
if n >> 1 & 1:
print("NO")
return
k = n // 2
s = k * (1 + k)
evens = list(range(2, 2 * k + 1, 2))
olds = []
old = 1
for i in range(k - 1):
olds.append(old)
s -= old
old += 2
olds.append(s)
ans = evens + olds
print("YES")
print(*ans)
# t = 1
t = II()
for _ in range(t):
solve()

京公网安备 11010502036488号