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