版权声明:原创,未经作者允许禁止转载 https://blog.csdn.net/Mr_wuyongcong/article/details/86577063
正题
题目大意
一个 的线段树包含 的区间,求最小的
解题思路
一下,从下面开始往上扩展区间,知道变成 的格式就就可以去最小值了。
记得剪枝
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
ll t,l,r,lim,mins;
void dfs(ll l,ll r)
{
if(l<0||r>lim) return;
if(r>mins) return;
if(l==0){
mins=min(mins,r);
return;
}
int k=r-l+1;
dfs(l-k,r);
dfs(l-k-1,r);
if(l>=k*2)dfs(l,r+k);
if(l>=k*2-1)dfs(l,r+k-1);
}
int main()
{
scanf("%lld",&t);
for(ll i=1;i<=t;i++)
{
mins=1e18;
scanf("%lld%lld%lld",&l,&r,&lim);
if(l==r||!r){
printf("%lld\n",r);
continue;
}
dfs(l,r);
if(mins>lim) printf("-1\n");
else printf("%lld\n",mins);
}
}