CF359B Permutation 构造


正解:构造

解题报告:

这个是传送门!

昂直接讲思路趴?毕竟这种构造题的话除了思路也没什么好说的只要想明白辽还是通常来说难度不大的$QwQ$

首先提供一个对正解毫无启发的的想法$QAQ$

就首先可以把右边那个拆一下,就变成奇数位之和-偶数位之和的绝对值,于是可以发现,只要不改变奇偶相对位置,右边就不会改变

于是就变成只要凑出左边就欧克辽

那左边的话,显然不能改变奇偶顺序,如果同时改变奇位和偶位比较难考虑了还是?

那就先让它单调增排列不改变奇位只改偶

那这个时候就发现,如果改变相邻为$k$的,相当于是$+=2\cdot k$

然后就欧克了似乎?$over$

然后港下$psj$说的解法$QwQ$

考虑不改变左边,怎么不改变左边呢?也不难,让相邻的位置不变,左边就不变了(就,$(1,2)$成一对儿,$(3,4)$成一对儿这样子的,懂?)

然后通过调换每一对的相对顺序,依然是先单调递增排列,每交换一对儿的相对位置相当于就是$+=2$

然后就欧克了

哦再注意一下的是,它给的条件中港了,$2\cdot k\leq n$,所以其实这个是给了我们提示的吼!

(↑这句话大概可以作为做构造题的方法,等到了寒假所有构造题刷完了要总结下套路什么的鸭$QwQ$虽然名义上是说没有什么套路辣但其实还是有那么点儿的还是要总结下$QwQ$

$dbq$总结好像咕了

over!

 

#include<bits/stdc++.h>
using namespace std;
#define rp(i,x,y) for(register int i=x;i<=y;++i)

int n,k;

inline int read()
{
    char ch=getchar();int x=0;bool y=1;
    while(ch!='-' && (ch>'9' || ch<'0'))ch=getchar();
    if(ch=='-')ch=getchar(),y=0;
    while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=getchar();
    return y?x:-x;
}

int main()
{
    n=read();k=read();
    rp(i,0,n-1)
    {
        if(k){printf("%d %d ",(i+1)<<1,(i<<1)|1);--k;}
        else printf("%d %d ",(i<<1)|1,(i+1)<<1);
    }
    return 0;
}
View Code

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM