Solve this interesting problem


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



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 

Lu≠Ru, 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(DFS)_#include



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=ncontains 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.
0≤L≤R≤109
LR−L+1≤2015


 



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


2015 Multi-University Training Contest 3





题意:求满足输入区间的最小整数n,没有的话输出-1


思路:四种情况,直接爆搜即可





#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

using namespace std;

int n,m;
int minn;

void DFS(int l,int r)
{
    if(minn && r>=minn)
    {
        return ;
    }

    if(l == 0)
    {
        if(minn)
        {
            minn = min(r,minn);
        }
        else
        {
            minn = r;
        }
        return ;
    }
    if((l+l)<(r+1))
    {
        return ;
    }
    
    DFS((l-1)*2-r,r);
    DFS((l-1)*2+1-r,r);
    DFS(l,2*r-l);
    DFS(l,2*r-l+1);

}

int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        minn = 0;
        if(m == 0)
        {
            printf("0\n");
            continue;
        }
        DFS(n,m);
        if(minn)
        {
            printf("%d\n",minn);
        }
        else
        {
            printf("-1\n");
        }
    }
    return 0;
}