题目地址: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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-10 07:36:18