线段树建树的时候是树根的区间是[0,n],现在给定一个区间[l,r],求问是否存在这样的树根,也就是求n
也就是直接从树的节点往上搜,看看能否搜到树根。注意几个剪枝。
代码:
1 #include <cstdio> 2 using namespace std; 3 typedef long long ll; 4 #define INF 1e18 5 ll ans; 6 void dfs(ll l,ll r) 7 { 8 if(r>=ans) return; 9 if(l<0) return ; 10 if(l==0) 11 { 12 ans=r; 13 return; 14 } 15 if(r+1>2*l) return ; 16 dfs(l*2-r-1,r);//考虑左节点往上,右节点往上,考虑一下奇偶,四个方向就出来了。 17 dfs((l-1)*2-r,r); 18 dfs(l,r*2-l); 19 dfs(l,r*2-l+1); 20 } 21 22 int main() 23 { 24 ll l,r; 25 while (scanf ("%lld %lld",&l,&r)!=EOF) 26 { 27 ans=INF; 28 dfs(l,r); 29 if(ans==INF) 30 printf("-1 "); 31 else printf("%lld ",ans); 32 } 33 return 0; 34 }