1. 程式人生 > 其它 >D-和諧之樹:求線段樹的最大節點

D-和諧之樹:求線段樹的最大節點

易知,線段樹是完全二叉樹,最大節點在最深層的最右邊,所以要找最深且最右;

二分來找,判斷標準是檢視每個節點的左子樹和右子樹誰的深度大,如果一樣就走右。(最深->最右)

查詢深度,很神奇

由於線段樹的性質,可以已知區間長度,通過模擬建造二叉樹的方式得到高度,即深度。

1 ll count(ll x){//區間長度
2     ll t=1;
3     while(x>1){
4         x=(x+1)/2;//不斷合併向上
5         t++;//高度++
6     }
7     return t;
8 }

由此易得:

 1 #include<iostream>
 2
using namespace std; 3 #define ll long long 4 ll count(ll x){//區間長度 5 ll t=1; 6 while(x>1){ 7 x=(x+1)/2;//不斷合併向上 8 t++;//高度++ 9 } 10 return t; 11 } 12 ll ans=0; 13 void query(ll l,ll r,ll root){ 14 ans=max(ans,root); 15 if(l==r)return; 16 ll mid=l+(r-l)/2
; 17 ll leftdepth=count(mid-l+1); 18 ll rightdepth=count(r-(mid+1)+1); 19 if(leftdepth>rightdepth){ 20 query(l,mid,root*2); 21 } 22 else{ 23 query(mid+1,r,root*2+1); 24 } 25 } 26 int main(void){ 27 ll T;scanf("%lld",&T); 28 while(T--){ 29 ans=0
; 30 ll n;scanf("%lld",&n); 31 query(1,n,1); 32 printf("%lld\n",ans); 33 } 34 return 0; 35 }