Автор проблеми: | Хасан Салех (MathModel) |
Підготовлено: | Хасан Салех (MathModel) |
Редагував: | Хасан Салех (MathModel) |
Розв'язок
Нам дана перестановка з \{1,2,\dots,n\} і визначаємо
Необхідна умова:
тобто парні індекси є локальними максимумами, а непарні індекси є локальними мінімумами.
Замість того, щоб безпосередньо порівнювати сусідів, ми накладаємо більш сильний інваріант:
для кожного парного індексу , зробіть
для кожного непарного індексу i\ge3, зробіть
Якщо це виконується, умова зигзагу автоматично задовольняється.
Отже, нам потрібна лише перестановка, яка забезпечує ці нерівності.
Конструкція
встановіть
тоді
для кожного парного індексу i<n, встановіть
для кожного непарного індексу i\ge3, встановіть
якщо парне, встановіть
Це безпосередньо дає
(з в кінці, якщо парне).
Дійсна конструкція існує для всіх n\ge1, тому ми ніколи не виводимо .
Складність .
for _ in range(int(input())):
n=int(input())
p=[0]*n
for i in range(n):p[i]=i+1
for i in range(1,n-1,2):
p[i],p[i+1]=p[i+1],p[i]
a=[p[i]/(i+1) for i in range(n)]
for i in range(1,n-1):
if(i%2==0):
assert(a[i-1]>a[i] and a[i]<a[i+1])
else:
assert(a[i-1]<a[i] and a[i]>a[i+1])
print(*p)