Перестановка мрії#12461

Перестановка мрії (Розбір)

Автор задачі:

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;
    }
}