1. 程式人生 > >【AtCoder】AGC006 Median Pyramid Easy

【AtCoder】AGC006 Median Pyramid Easy

文章目錄

題目

傳送門

題目大意

有一個NN層的數字金字塔如左圖所示,最下面一層寫了2N12N-1個數(這些數是1,2,...,N1,2,...,N的一個排列),然後用以下規則填滿這個金字塔: 第i(i<N)i(i<N)行第jj個數為第i+1i+1行的第j1j-1jjj+1j+1個數(即它左下、下、右下的數)的中位數。 圖示 現在給出金字塔的層數NN和頂端的數XX,問能否構造出底層的排列,如果可以,輸出這個排列。

思路

我真的想問AtCoder出題人的腦洞有多大= = 這道題的解法越想越奇妙= =

首先,當X=1X=1X=2N1X=2N-1時無解(可以理解),其他情況均有解(見下面)。 你發現,只要在倒數第二行中部出現了一對XXXX基因?,那麼頂端一定是XX,如圖所示: 圖示 因為X,X,aX,X,a的中位數一定是XX

於是做完了,你隨便構造一下使倒數第二行中部有兩個XX即可。 例如:x1,x,x+1,x2x-1,x,x+1,x-2(當x=2x=2的時候特殊處理一下)。

程式碼

極醜。

#include<cstdio>

int N,X;

int main(){
    scanf("%d%d",
&N,&X); if(X==1||X==2*N-1) return !puts("No"); puts("Yes"); if(N==2) return !puts("1\n2\n3"); if(X==2){ for(int i=1;i<=N-2;i++) printf("%d\n",4+i); printf("3\n2\n1\n4\n"); for(int i=1;i<=N-3;i++) printf("%d\n"
,N+2+i); return 0; } int cnt=1; for(int i=1;i<=N-2;i++){ if(cnt==X-2) cnt=X+2; printf("%d\n",cnt++); } printf("%d\n%d\n%d\n%d\n",X-1,X,X+1,X-2); for(int i=1;i<=N-3;i++){ if(cnt==X-2) cnt=X+2; printf("%d\n",cnt++); } }