[关闭]
@tenlee 2015-07-31T08:28:11.000000Z 字数 935 阅读 1488

HDU 5323 Solve this interesting problem(2015多校联合)

HDUOJ


题目链接:戳我

题目大意

0....n 建立线段树,问是否存在 区间为 L R 的 这个叶子节点,存在找到最小的n,不存在输出1

样例解释

6 7 //线段树Build(0, 7),刚好存在6 7这个叶子节点,故输出7
10 13 // 不存在
10 11 //同理

解题思路

根据线段树 父亲节点的区间 和 孩子节点的 区间的关系,可得知 若孩子节点时l,r,则父亲节点有4种情况(见代码注释),依次枚举即可。
但要注意 剪枝。

代码

  1. //Author LJH
  2. //www.cnblogs.com/tenlee
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <cctype>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <vector>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #define clc(a, b) memset(a, b, sizeof(a))
  14. using namespace std;
  15. const int inf = 0x3f;
  16. const int INF = 0x3f3f3f3f;
  17. const int maxn = 1e6+5;
  18. int L, R, ans;
  19. void dfs(int l, int r)
  20. {
  21. if(r < l || r < 0 || l < 0) return;
  22. if(r > 2*R) return;
  23. if(ans != -1 && r >= ans) return;
  24. if(l == 0)
  25. {
  26. ans = r;
  27. return;
  28. }
  29. //printf("l = %d, r = %d\n", l, r);
  30. int x, y;
  31. // (x+r) / 2 + 1 = l x+r为偶数
  32. x = (l - 1) * 2 - r;
  33. dfs(x, r);
  34. //(x+r-1) / 2 + 1 = l x+r为奇数
  35. x = (l - 1) * 2 + 1 - r;
  36. dfs(x, r);
  37. //(l + y) / 2 = r
  38. y = 2 * r - l;
  39. dfs(l, y);
  40. //(l + y - 1) / 2 = r
  41. y = 2 * r + 1 - l;
  42. dfs(l, y);
  43. }
  44. int main()
  45. {
  46. while(~scanf("%d %d", &L, &R))
  47. {
  48. ans = -1;
  49. dfs(L, R);
  50. printf("%d\n", ans);
  51. }
  52. return 0;
  53. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注