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. 
 
 
  

 
 
 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;
}  
 










