Автор задачі: | Hadi Takla (TaklaOI) |
Підготував: | Hadi Takla (TaklaOI) |
Відредагував: | Hadi Takla (TaklaOI) |
Розв'язок
Оскільки є перестановкою, максимальна сума двох значень, яку ми можемо отримати, дорівнює n + n-1 = 2n - 1.
Тепер, для фіксованого значення , знайдемо значення , при яких (x + y) (n+1) = 0.
(x + y) (n+1) = 0, тому x + y = k \cdot (n+1), оскільки суми є додатними, k \in N.
при k=1 \Rightarrow x + y = n+1 \Rightarrow y = n+1-x.
при k=2, x + y = 2n+2, але 2n+2 > 2n-1, тому така сума недосяжна.
Тепер, для фіксованого значення , знайдемо значення , при яких (x + y) (n+1) = n.
(x + y) (n+1) = n, тому x + y = n + k \cdot (n+1) і k \in N.
при k = 0 \Rightarrow x + y = n \Rightarrow y =n - x.
при k = 1, x + y = 2n + 1, 2n + 1 > 2n - 1, тому така сума недосяжна.
Отже, для значення існує щонайбільше два значення, які можна розмістити як сусіда до , а саме n+1-x , n - x.
коли x = n, значення є , оскільки ми не можемо помістити у перестановку, значення повинно мати лише одного сусіда, тому значення має знаходитись або на індексі , або на індексі .
Оскільки кожне значення має щонайбільше два підходящих сусідніх значення, ми можемо будувати перестановку поелементно після визначення індексу значення .
Часова складність .
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int tc;
cin>>tc;
while(tc -- )
{
int n;
cin>>n;
int l = 1 , r = n;
for(int i=1;i<=n;i++)
{
cout<<(i%2 ? r-- : l++)<<' ';
}
cout<<endl;
}
}