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;
}
posted @ 2020-04-26 19:13  chdy  阅读(107)  评论(0编辑  收藏  举报