HDU 5323 Solve this interesting problem

63 篇文章 0 订阅
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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值