题意:给定整数\(n\)和\(k\),构造一个长度为\(2*n\)的排列,满足:\(\sum_{i=1}^{n}\mid{a_{2i}-a_{2i-1}}\mid-\mid\sum_{i=1}^{n} a_{2i}-a_{2i-1} \mid=2*k\)
分析:一看到排列,就知道是要找性质了.首先不难发现如果排列正好是\(1,2,....2*n-1,2*n\),那么这个初始排列的贡献是0.
然后我们考虑交换相邻两项,可以发现式子\(\sum_{i=1}^{n}\mid{a_{2i}-a_{2i-1}}\mid\)的值没有改变,而式子\(\mid \sum_{i=1}^{n} a_{2i}-a_{2i-1} \mid\)的值变小了2,所以既然每交换\(2*i-1\)和\(2*i\)就会产生2的贡献,我们就只要交换k次即可.
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;
inline int read(){
    int x=0,o=1;char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')o=-1,ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*o;
}
int main(){
	int n=read(),k=read();
	for(int i=1;i<=n;++i){
		if(k){
			printf("%d %d ",2*i,2*i-1);
			--k;
		}
		else printf("%d %d ",2*i-1,2*i);
	}puts("");
    return 0;
}