題解/算法 {小红的完全二叉树构造}
@LINK: https://ac.nowcoder.com/acm/contest/71593/C?&headNav=acm
;
首先 她是一定有解的;
做法是: 所有葉子節點 都放奇數, 然後對於非葉子節點 如果他的兒子至少有一個是奇數 那麼他就放偶數, 否則她優先放奇數 也可以放偶數;
只要思路知道了, 重點在於 你怎麼構造這個樹! (如果你構造這個樹 太複雜, 這會變得很複雜…)
一個巧妙的做法是: 這個完全二叉樹的節點編號 就設置為123...
(x的兒子是2*x, 2*x+1
), 然後用ANS[i]
表示 這個節點的值;
int even = (N&1 ? N-1:N), odd = (N&1 ? N:N-1);
vector<int> ANS(N+1);
FOR_R_( i, N, 1){
int ls = i*2, rs = ls + 1;
if( ls > N){ // `i` is leaf
ANS[i] = odd; odd -= 2;
}
else{
if(ANS[ls] & 1){ ANS[i] = even; even -= 2;}
else if(rs<=N && (ANS[rs]&1)){ ANS[i] = even; even -= 2;}
else{
if( odd >= 1){ ANS[i] = odd; odd -= 2;}
else{ ANS[i] = even; even -= 2;}
}
}
}