一道dfs,就是告诉你一个线段树的节点,问你有这个节点的线段树的根节点的n最小是多少,如果没有,输出-1,那么我们知道,一个线段树的节点,他的父亲节点有4种状态,只要dfs上去就好了。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <math.h>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
const __int64 maxn = 1e18 + 5;
__int64 mins;
void dfs(__int64 l, __int64 r)
{
if(l < 0)
return;
if(!l)
{
if(mins > r)
mins = r;
return;
}
if(r >= mins)
return;
if(r - l + 1 > l)
return;
dfs(2 * l - r - 2, r);
dfs(2 * l - r - 1, r);
dfs(l, 2 * r - l);
dfs(l, 2 * r - l + 1);
}
int main()
{
__int64 l, r;
while(~scanf("%I64d%I64d", &l, &r))
{
mins = maxn + 1;
dfs(l, r);
if(mins == maxn + 1)
printf("-1\n");
else
printf("%I64d\n", mins);
}
return 0;
}