CF R 209 div 2 CF359B Permutation 构造
LINK:Permutation
休闲一下 开了一道构造题。
看起来毫无头绪 其实仔细观察第二个条件 0<=2k<=n.
容易想到当n是奇数的时候 k的范围更小 再手玩一下第一个条件 容易发现 想要价值 必须使得 后面的式子 正值和负值抵消掉。
这样每次差是偶数倍 所以只需要凑出来k就行了 而后面的式子想刚好抵消掉k如果直接使用两个数字的话构造会略显繁杂。
考虑多个数字抵消 那么容易想到 两个相邻的数字带来的贡献为1 这样使用两个相邻的数字不断构造正数和负数抵消k即可。
刚好这样做 k还是在合理的范围内的 对于奇数 让两边的式子自己抵消即可 可以对于右边限定负数也可以限定正数.
const int MAXN=50010<<1;
int n,k,top;
int a[MAXN];
inline void calc(int w,int x)//w个数字构成答案x.
{
rep(1,w,i)
{
a[i*2]=i*2,a[i*2-1]=i*2-1;
if(x)swap(a[i<<1],a[i*2-1]),--x;
}
}
int main()
{
//freopen("1.in","r",stdin);
get(n);get(k);
int cc=(n>>1)<<1;
calc(cc,k);
rep(1,cc*2,i)printf("%d ",a[i]);
if(n&1)printf("%d ",n*2-1),printf("%d ",n*2);
return 0;
}