2015 多校联赛 ——HDU5323(搜索)

 

Solve this interesting problem

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

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

 


它的上一个节点有(2*l-2-r,r),(2*l-1-r,r),(l,2*r-l+1),(l,2*r - l)四种情况,直接搜索,加上几个特殊判断即可。



 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
typedef long long ll;
using namespace std;
ll maxn = 0x3f3f3f3f;
ll ma;

void dfs(ll l,ll r)
{
    if(l == 0)
    {
        ma = min(r,ma);
        return;
    }
    if(l > r)
        return ;
    if(r >= 1e18)
        return ;
    if(r - l + 1 > l)
        return ;
    if(l == r)
    {
        ma = r;
        return ;
    }
    dfs(2*l-2-r,r);
    dfs(2*l-1-r,r);
    dfs(l,2*r-l+1);
    dfs(l,2*r - l);
    return ;
}

int main()
{
    ll a,b;
    //freopen("8.txt","r",stdin);
    while(~scanf("%I64d%I64d",&a,&b))
    {
        ma = maxn;
        dfs(a,b);

        if(ma == maxn)
            printf("-1\n");
        else
            printf("%I64d\n",ma);
    }
    return 0;
}

  

posted @ 2015-07-29 14:46  Przz  阅读(146)  评论(0编辑  收藏  举报