Solve this interesting problem
Problem Description
Have you learned something about segment tree? If not, don’t worry, I will explain it for you.
Segment Tree is a kind of binary tree, it can be defined as this:
- For each node u in Segment Tree, u has two values: Lu and Ru .
- If Lu=Ru , u is a leaf node.
- If Lu≠Ru , u has two children x and y,with Lx=Lu , Rx=⌊Lu+Ru2⌋ , Ly=⌊Lu+Ru2⌋+1 , Ry=Ru .
Here is an example of segment tree to do range query of sum.
Given two integers L and R, Your task is to find the minimum non-negative n satisfy that: A Segment Tree with root node's value Lroot=0 and Rroot=n contains a node u with Lu=L and Ru=R .
Segment Tree is a kind of binary tree, it can be defined as this:
- For each node u in Segment Tree, u has two values: Lu and Ru .
- If Lu=Ru , u is a leaf node.
- If Lu≠Ru , u has two children x and y,with Lx=Lu , Rx=⌊Lu+Ru2⌋ , Ly=⌊Lu+Ru2⌋+1 , Ry=Ru .
Here is an example of segment tree to do range query of sum.
![](https://i-blog.csdnimg.cn/blog_migrate/907ee251f73a54a6d38aa5507a81c094.jpeg)
Given two integers L and R, Your task is to find the minimum non-negative n satisfy that: A Segment Tree with root node's value Lroot=0 and Rroot=n contains a node u with Lu=L and Ru=R .
Input
The input consists of several test cases.
Each test case contains two integers L and R, as described above.
0≤L≤R≤109
LR−L+1≤2015
Each test case contains two integers L and R, as described above.
0≤L≤R≤109
LR−L+1≤2015
Output
For each test, output one line contains one integer. If there is no such n, just output -1.
Sample Input
6 7 10 13 10 11
Sample Output
7 -1 12
/* * 给定一个区间的 L R 问知否存在这样的线段树 [0 , n] 使得n最小并且包含区间 [L, R] * dfs向上搜索, 由于该区间可能是父节点的左儿子或右儿子,分类讨论,注意取整时可能 * 导致求得的L 或 R 与实际相差1 , 将这四种情况都考虑即可。 * 注意剪枝, 在线段树中,每个节点的左儿子区间 = 右儿子区间 或者 右儿子加一 */
#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
typedef long long ll;
ll ans = -1;
void dfs(ll l, ll r) {
if(l == 0) {
if(ans == -1) {
ans = r;
}
else {
ans = min(ans, r);
}
return ;
}
if(l < 0) return ;
if(ans != -1 && r >= ans) return ;
if(l < r-l+1) return; // 剪枝
dfs(l, 2*r - l);
dfs(l, 2*r - l + 1);
dfs(2*l - r - 1, r);
dfs(2*l - r - 2, r);
}
int main() {
ios::sync_with_stdio(false);
ll l, r;
while(cin >> l >> r) {
if(l == r) {
cout << l << endl;
continue;
}
ans = -1;
dfs(l, r);
cout << ans << endl;
}
return 0;
}