(更新中)"華為杯" 武漢大學21級新生程式設計競賽 非官方題解
阿新 • • 發佈:2022-04-04
"華為杯" 武漢大學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; } }