cf483C(题号疑似有误)
题目描述
构造一个长度为n的排列,使得集合\(\{|p_i-p_{i+1}|\}\)的大小为k。n<=10^5
做法
构造题。
考虑让\(|p_i-p_{i+1}|=k-i+1\),这样,k+1项后就可以构造出这个集合。然后把剩下的从小到大排序放过去即可。
如何让\(|p_i-p_{i+1}|=k-i+1\)呢?可以这样:1, k+1, 2, k, 3, k-1...
#include<bits/stdc++.h>
using namespace std;
int n,k;
int main(){
cin>>n>>k;
int now=1;
bool d=1;
for(int i=1;i<=k+1;i++){
cout<<now<<' ';
if(d)now+=k-i+1;
else now-=k-i+1;
d=!d;
}
for(int i=k+2;i<=n;i++){
cout<<i<<' ';
}
}