題解/算法 {小红的完全二叉树构造}

題解/算法 {小红的完全二叉树构造}

@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;}
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值