码迷,mamicode.com
首页 > 其他好文 > 详细

hdu5323 多校题

时间:2015-07-30 13:38:57      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:搜索

给你一个区间(L,R)  要你求n  对于一颗线段树根节点(0,n) 线段树中存在区间为(L,R)的节点    求最小的n    说一下思路吧   这就是相当于告诉你子节点   让你求根节点吧 ,分情况讨论了     先想想在线段树中如何根据根节点得到子节点的    容易想出父亲节点的4中情况吧

1.[ l , 2*r-l ]

2.[ l , 2*r+1-l ] 

3.[ (l-1)*2-r , r ]

4.[ (l-1)*2+1-r , r ]

 然后就可以dfs了 注意 这里有个地方容易错   就是搜的顺序  因为我们是要找最小的n   所以先往左边即3和4(就是尽量让l快点到0   这样就能得到小的n    可以减少很多情况)   开始没注意  爆栈了好多次==



#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

__int64 n;
int dfs(__int64 l,__int64 r)
{
    if(l==0)
    {
        if(n==-1) n=r;
        else
        {
            if(n>r) n=r;
        }
        return 0;
    }

     
    if( n != -1 && r >= n ) return 0;
    if( l < 0 ) return 0;
    if( r-l+1 > (l-1)*2 ) return 0;
    

    dfs((l-1)*2-r,r) ;
    dfs((l-1)*2+1-r,r) ;
    dfs(l,r*2-l) ;
    dfs(l,r*2+1-l);
    return 0;
}
int main()
{
    __int64 l,r;
    while(~scanf("%I64d%I64d",&l,&r))
    {
        n=-1;
        dfs(l,r);
        printf("%I64d\n",n);
    }    
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu5323 多校题

标签:搜索

原文地址:http://blog.csdn.net/zxf654073270/article/details/47147083

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!