• 2015 Multi-University Training Contest 3 1008(DFS)


    Solve this interesting problem

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


    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
     
     
    题意:给定区间[L,R],能否生成包含该区间的线段树,如果能,包含该段的线段树[0,n]的n的最小值是多少
    分析:区间[L,R]可能是父区间的左孩子也可能是父区间的右孩子,所以有可能有四种情况,[L,R+(R-L+1)],[L,R+(R-L+1)-1],[L-(R-L+1),R],[L-(R-L+1)-1,R]
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<string>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<stack>
    #include<queue>
    #include<vector>
    #include<map>
    #include<stdlib.h>
    #include<algorithm>
    #define LL __int64
    using namespace std;
    const int INF=0x3f3f3f3f;
    LL L,R,ans;
    
    void DFS(LL l,LL r)
    {
        LL len=r-l+1;  //区间长度
        if(r>=ans) return ;
        if(l==0)
        {
            ans=r;
            return ;
        }             //结束递归
        if(len>l) return ;  
    
        DFS(2*l-r-1,r);
        DFS(2*l-r-2,r);
    
        DFS(l,2*r-l);
        DFS(l,2*r-l+1);
    }
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        while(scanf("%I64d %I64d",&L,&R)!=EOF)
        {
            ans=INF;
            DFS(L,R);
            if(ans==INF) cout<<"-1"<<endl;
            else cout<<ans<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    VS2005 DataGridView 和 GirdView 横向大比拼
    表结构信息查询
    在自己的网页中嵌入搜索引擎
    自定义AJAX请求获取地图范围
    oracle远程连接配置
    oracle账户被锁定问题
    JDK环境配置
    PythonWin运行出错解决办法
    HDF库的调试过程
    ajax入门详解
  • 原文地址:https://www.cnblogs.com/clliff/p/4687236.html
Copyright © 2020-2023  润新知