2015 Multi-University Training Contest 3 hdu 5323 Solve this interesting problem

本文介绍了一种利用递归深度优先搜索解决特定段树范围查询的方法。针对给定的两个整数L和R,寻找最小非负整数n,使得根节点值为[0,n]的段树中存在一个节点的值恰好为[L,R]。通过递归地检查四个可能的子区间来求解,最终输出满足条件的n或-1表示不存在。

Solve this interesting problem

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1479    Accepted Submission(s): 423


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 LuRu, 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.
0LR109
LRL+12015
 

 

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
 

 

Source
 
解题:搜索
 
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const LL INF = 0x3f3f3f3f3f3f3f3f;
 5 LL X,Y,ret;
 6 void dfs(LL L,LL R) {
 7     if(R >= ret || L < 0) return;
 8     if(L == 0) {
 9         ret = min(ret,R);
10         return;
11     }
12     if(R - L + 1 > L) return;
13     dfs(2*L - R - 2,R);
14     dfs(2*L - R - 1,R);
15     dfs(L,2*R - L);
16     dfs(L,2*R - L + 1);
17 }
18 
19 int main() {
20     while(~scanf("%I64d%I64d",&X,&Y)) {
21         ret = INF;
22         dfs(X,Y);
23         printf("%I64d\n",ret == INF?-1:ret);
24     }
25     return 0;
26 }
View Code

 

转载于:https://www.cnblogs.com/crackpotisback/p/4686070.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值