jzoj4208-线段树什么的最讨厌了【dfs】

版权声明:原创,未经作者允许禁止转载 https://blog.csdn.net/Mr_wuyongcong/article/details/86577063

正题


题目大意

一个 0 n 0\sim n 的线段树包含 l r l\sim r 的区间,求最小的 n n


解题思路

d f s dfs 一下,从下面开始往上扩展区间,知道变成 0 x 0\sim x 的格式就就可以去最小值了。

记得剪枝


c o d e code

#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);
	}
}

猜你喜欢

转载自blog.csdn.net/Mr_wuyongcong/article/details/86577063