CF483C Diverse Permutation
题意翻译:
构造一个长度为n的排列,使得集合 { ∣ p i − p i + 1 ∣ } \{|p_i-p_{i+1}|\} {∣pi−pi+1∣} 的大小为 k k k 。 n < = 1 0 5 n<=10^5 n<=105
思路:
构造题
简化问题,我们考虑怎么用
k
+
1
k+1
k+1 个数构造出答案,这样剩下的数从小到大放就可以了
显然我们可以这样构造:
a
i
=
a
i
−
1
+
(
k
−
i
+
1
)
(
i
%
2
=
1
)
a_{i}=a_{i-1}+(k-i+1)(i\%2=1)
ai=ai−1+(k−i+1)(i%2=1)
a
i
=
a
i
−
1
−
(
k
−
i
+
1
)
(
i
%
2
=
0
)
a_{i}=a_{i-1}-(k-i+1)(i\%2=0)
ai=ai−1−(k−i+1)(i%2=0)
手完即可知道正确性
非常短的代码:
#include<bits/stdc++.h>
#define freo(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
#define ll long long
using namespace std;
int n,k,x=1;
inline ll read()
{
ll ret=0;char ch=' ',c=getchar();
while(!(c<='9'&&c>='0')) ch=c,c=getchar();
while(c<='9'&&c>='0') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar();
return ch=='-'?-ret:ret;
}
int main()
{
n=read();k=read();
for(int i=1;i<=k+1;i++)
{
cout<<x<<" ";
if(i&1) x+=k-i+1;
else x-=k-i+1;
}
for(int i=k+2;i<=n;i++) cout<<i<<" ";
return 0;
}