HDU 5323 Solve this interesting problem

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.

HDU 5323 Solve this interesting problem_第1张图片

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

dfs+剪枝

#include<cstdio>
#include<vector>
#include<cstring>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;
const long long maxn=50005;
long long l,r,flag;

void dfs(long long l,long long r)
{
    if (flag&&r>=flag) return;
    if (l==0) {
        if (flag) flag=min(r,flag);
        else flag=r;
        return ;
    }
    if (l+l<r+1) return;
    long long mid=r-l+1;
    dfs(l-mid-1,r);
    dfs(l-mid,r);
    dfs(l,r+mid);
    dfs(l,r+mid-1);
}

int main()
{
    //scanf("%lld",&T);
    while (~scanf("%lld%lld",&l,&r))
    {
        flag=0;
        if (r==0) {printf("0\n"); continue;}
        dfs(l,r);
        if (flag) printf("%lld\n",flag);
        else printf("-1\n");
    }
    return 0;
}


你可能感兴趣的:(HDU)