G. Special Permutation
题目链接-G. Special Permutation
题目大意
请你构造一个
1
−
n
1-n
1−n的全排列序列p,满足
2
≤
∣
p
i
−
p
i
+
1
∣
≤
4
2≤|p_i−p_{i+1}|≤4
2≤∣pi−pi+1∣≤4
解题思路
- 首先当
n
<
4
n<4
n<4时,无论如何都不能构造出满足条件的序列,所以直接输出
-1
- n > 4 n>4 n>4时,因为每两个奇数之间相差 2 2 2,每两个偶数之间也相差 2 2 2,我们可以用这个这个性质来构造序列
- 不管奇数偶数各自是降序还是升序,在衔接部分总不满足 2 ≤ ∣ p i − p i + 1 ∣ ≤ 4 2≤|p_i−p_{i+1}|≤4 2≤∣pi−pi+1∣≤4,我们可以将奇数降序排列,那么与偶数衔接的数就是1,然后偶数升序排列,但是 4 4 4和 2 2 2的位置要换一下位置,这样 2 ≤ ∣ 1 − 3 ∣ ≤ 4 2≤|1-3|≤4 2≤∣1−3∣≤4, 2 ≤ ∣ 2 − 6 ∣ ≤ 4 2≤|2-6|≤4 2≤∣2−6∣≤4,就满足条件了
- 具体操作见代码
附上代码
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
#define endl '\n'
using namespace std;
const int INF=0x3f3f3f3f;
const int dir[4][2]={-1,0,1,0,0,-1,0,1};
const double PI=acos(-1.0);
const double e=exp(1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=2e5+10;
typedef long long ll;
typedef pair<int,int> PII;
typedef unsigned long long ull;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
if(n<4){
cout<<-1<<endl;
continue;
}
for(int i=n;i>=1;i--)
if(i&1) cout<<i<<" ";
cout<<4<<" "<<2<<" ";
for(int i=6;i<=n;i+=2)
cout<<i<<" ";
cout<<endl;
}
return 0;
}