hdu 5323 (DFS)

  线段树建树的时候是树根的区间是[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\n");
31         else printf("%lld\n",ans);
32     }
33     return 0;
34 }

 

posted on 2015-07-29 15:39  Bei_insomia  阅读(280)  评论(0编辑  收藏  举报

导航