题目
输入一个n(3<=n<=1e4),你需要输出一个0到n的排列,
使得排列中不存在长度为3的子序列ai,aj,ak(i<j<k)满足aj-ai=ak-aj,即三项的等差数列
如n=3时,输出0 2 1,因为0 1 2不合法
思路来源
题解
比较考验脑洞的题目吧orz
考虑n=4,先构造0 1 2 3 4,把0 2 4放在左区间,1 3放在右区间
偶数放左,奇数放右,此时左为等差,右为等差,左右不可能构成等差
跨区间的三个数必为两偶一奇或一偶两奇,不可能构成等差数列
放好之后,将该操作递归下去,直至区间长度<3,<=2或<=1随意
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e4+10;
int n,a[N],b[N];
void cdq(int l,int r)
{
if(r-l<=1)return;
int mid=(l+r+1)>>1;//保证前半边不少于后半边
//0 2 4 1 3
for(int i=l;i<r;i++)
b[i]=a[i];
int now=l;
for(int i=l;i<r;i+=2)
a[now++]=b[i];
for(int i=l+1;i<r;i+=2)
a[now++]=b[i];
cdq(l,mid);cdq(mid,r);
}
int main()
{
while(~scanf("%d",&n)&&n)
{
for(int i=0;i<n;++i)
a[i]=i;
cdq(0,n);
printf("%d:",n);
for(int i=0;i<n;++i)
printf(" %d",a[i]);
puts("");
}
return 0;
}