题意:给定整数(n)和(k),构造一个长度为(2*n)的排列,满足:(sum_{i=1}^{n}mid{a_{2i}-a_{2i-1}}mid-midsum_{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;
}