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.
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 -112
dfs+剪枝
#include<cstdio> #include<vector> #include<cstring> #include<map> #include<queue> #include<algorithm> using namespace std; const long long maxn=50005; long long l,r,flag; void dfs(long long l,long long r) { if (flag&&r>=flag) return; if (l==0) { if (flag) flag=min(r,flag); else flag=r; return ; } if (l+l<r+1) return; long long mid=r-l+1; dfs(l-mid-1,r); dfs(l-mid,r); dfs(l,r+mid); dfs(l,r+mid-1); } int main() { //scanf("%lld",&T); while (~scanf("%lld%lld",&l,&r)) { flag=0; if (r==0) {printf("0\n"); continue;} dfs(l,r); if (flag) printf("%lld\n",flag); else printf("-1\n"); } return 0; }