2015 Multi-University Training Contest 3 hdu 5323 Solve this interesting problem

Solve this interesting problem

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1479    Accepted Submission(s): 423


Problem Description
Have you learned something about segment tree? If not, don’t worry, I will explain it for you.
Segment Tree is a kind of binary tree, it can be defined as this:
- For each node u in Segment Tree, u has two values: Lu and Ru.
- If Lu=Ru, u is a leaf node. 
- If LuRu, u has two children x and y,with Lx=Lu,Rx=Lu+Ru2,Ly=Lu+Ru2+1,Ry=Ru.
Here is an example of segment tree to do range query of sum.



Given two integers L and R, Your task is to find the minimum non-negative n satisfy that: A Segment Tree with root node's value Lroot=0 and Rroot=n contains a node u with Lu=L and Ru=R.
 

 

Input
The input consists of several test cases. 
Each test case contains two integers L and R, as described above.
0LR109
LRL+12015
 

 

Output
For each test, output one line contains one integer. If there is no such n, just output -1.
 

 

Sample Input
6 7
10 13
10 11
 

 

Sample Output
7
-1
12
 

 

Source
 
解题:搜索
 
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const LL INF = 0x3f3f3f3f3f3f3f3f;
 5 LL X,Y,ret;
 6 void dfs(LL L,LL R) {
 7     if(R >= ret || L < 0) return;
 8     if(L == 0) {
 9         ret = min(ret,R);
10         return;
11     }
12     if(R - L + 1 > L) return;
13     dfs(2*L - R - 2,R);
14     dfs(2*L - R - 1,R);
15     dfs(L,2*R - L);
16     dfs(L,2*R - L + 1);
17 }
18 
19 int main() {
20     while(~scanf("%I64d%I64d",&X,&Y)) {
21         ret = INF;
22         dfs(X,Y);
23         printf("%I64d\n",ret == INF?-1:ret);
24     }
25     return 0;
26 }
View Code

 

posted @ 2015-07-29 15:32  狂徒归来  阅读(211)  评论(0编辑  收藏  举报