HDU 5323(2015多校3)-Solve this interesting problem(dfs+剪枝)

来源:互联网 发布:冒险岛自由市场数据库 编辑:程序博客网 时间:2024/04/29 15:25

题目地址:HDU 5323
题意:给一个l,r,表示区间[l,r],问是否存在区间为[0,n]的线段树的节点区间为[l,r],如果有求最小的n,如果没有输出-1。
思路:因为L/(R-L+1)<=2015,按照线段树的性质每次分区间序号扩大两倍,所以可以得出差不多有22层,所以用爆搜就可以,由上把[l,r]区间不断扩张,直到满足l==0为止。顺便剪剪枝。

#include <stdio.h>#include <math.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <sstream>#include <algorithm>#include <set>#include <queue>#include <stack>#include <map>#pragma comment(linker, "/STACK:102400000,102400000")using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const double pi= acos(-1.0);const double esp=1e-8;int ans;int dfs(int l,int r){    if(l<0) return ans;//控制左边界    if(!l){//保存当前最小的右边界        ans=min(ans,r);        return ans;    }    if(2*l<r+1) return ans;//剪枝。相当于控制右边界    if(l==r) {//左边界等于右边界的时候不用处理,直接输出、        return r;    }    //下面是四种情况。    dfs(l,2*r-l+1);    dfs(l,2*r-l);    dfs(2*l-r-1,r);    dfs(2*l-r-2,r);}int main(){    int l,r;    while(~scanf("%d %d",&l,&r)){        ans=inf;        ans=dfs(l,r);        if(ans==inf)            puts("-1");        else            printf("%d\n",ans);    }    return 0;}
1 0
原创粉丝点击