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

  

转载于:https://www.cnblogs.com/Przz/p/5409817.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值