1. 程式人生 > 其它 >(更新中)"華為杯" 武漢大學21級新生程式設計競賽 非官方題解

(更新中)"華為杯" 武漢大學21級新生程式設計競賽 非官方題解

"華為杯" 武漢大學21級新生程式設計競賽

https://ac.nowcoder.com/acm/contest/31620#question

D.和諧之樹

思路:披著線段樹外皮的二分。把區間逐層二分。注:要統計能到達的深度,深度相同時優先走右邊(比賽的時候就是因為這個沒過)

程式碼

#include <iostream>
#include <algorithm>

using namespace std;
typedef long long ll;
int t;
ll n, num, ans;

ll count (ll x) {
    ll tt = 1;
    while (x > 1) {
        x = (x + 1) / 2;
        tt ++;
    }
    return tt;
}

void dfs (ll l, ll r, ll num) {
    ans = max (ans, num);
    if (l == r)
        return ;
    ll mid = l + r  >> 1;
    if (count(mid - l + 1) > count(r - mid )) {
        dfs (l, mid, num << 1);
    }
    else {
        dfs (mid + 1, r, num << 1 | 1);
    }

}


int main () {
    cin >> t;
    
    while (t --) {
        cin >> n;
        ans = 0;
        dfs (1, n, 1);
        cout << ans << endl;
        

    }
    
        
}