排列(Permutation)较常出现;对排列的性质和 trick 需要积累;
Problem - 1928B - Codeforces 这道B对本题有较好启发:对于任意排列,再加上一个与一个相同大小的排列合并,可以将所有数变为 n+1;
故仅需:
对奇(偶)数项上从小到大的数依次加上 n,n-1,…… n/2+1;
对偶(奇)数项上从小到大的数依次加上 n/2,n/2-1,…… 1;
保证一排不小于 n+1,一排不大于 n 即可;
#include <bits/stdc++.h>
using namespace std;
const int max_n=4e5+5;
int n,x,flag;
struct node{int v,pos;};
vector<node>v;
vector<node>v2;
vector<node>ans;
bool cmp(const node x,const node y){return x.v<y.v;}
bool cmp2(const node x,const node y){return x.pos<y.pos;}
void solve()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;if(x==1)flag=i;
if(i&1){
v.push_back((node){x,i});
}else{
v2.push_back((node){x,i});
}
}
sort(v.begin(),v.end(),cmp);
sort(v2.begin(),v2.end(),cmp);
int mx=n,mn=n/2;
if(flag&1)swap(mx,mn);
for(int i=0;i<(int)v.size();i++){
ans.push_back((node){mx,v[i].pos});
ans.push_back((node){mn,v2[i].pos});
mx--,mn--;
}
sort(ans.begin(),ans.end(),cmp2);
for(auto ai:ans)cout<<ai.v<<" ";
cout<<endl;
v.clear();v2.clear();ans.clear();
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int _t;cin>>_t;
while(_t--){
solve();
}
return 0;
}