CF359B Permutation

洛咕

题意:给定整数\(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
#include
#include
#include
#include
#include
#include
#include
#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;
}

你可能感兴趣的:(CF359B Permutation)