正题
题目大意
一个0∼n0\sim n0∼n的线段树包含l∼rl\sim rl∼r的区间,求最小的nnn
解题思路
dfsdfsdfs一下,从下面开始往上扩展区间,知道变成0∼x0\sim x0∼x的格式就就可以去最小值了。
记得剪枝
codecodecode
#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);}
}