zoukankan      html  css  js  c++  java
  • 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
    ");
            else
                printf("%I64d
    ",ma);
        }
        return 0;
    }
    

      

  • 相关阅读:
    设计模式
    idea多个项目
    多个tomcat配置
    mysql数据库默认时间字段格式
    读取文件
    上传图片
    数据库创建用户授权
    统计12个月份的数据
    行列转换
    分页
  • 原文地址:https://www.cnblogs.com/Przz/p/5409817.html
Copyright © 2011-2022 走看看