hdu5323(2015多校3)--Solve this interesting problem(万万没想到,,,)
2015-07-29 14:59
316 查看
题目链接:点击打开链接
题目大意:给出一个区间[l,r],问这个区间能不能是一个线段树上的一段,线段树为0到n,求最小的n是多少。
按照题目给出的区间向根部搜,由子区间推到父区间,有四种可能(左右区间和(l+r)的奇偶性):
[ l , 2*r-l ]
[ l , 2*r+1-l ]
[ (l-1)*2-r , r ]
[ (l-1)*2+1-r , r ]
按照这四种方式向上搜,加上剪枝就可以AC
原因是l/(r-l+1) <= 2015,那么每向上搜一次,下面的区间和会增加两倍,l/区间和也就会减少一半,一直到l/区间和小于1后,那么也就是不会再存在可能了,最多会搜22次,,
注意:剪枝的时候当前值>= n 就return,如果写>n会超时,,,,,sad
题目大意:给出一个区间[l,r],问这个区间能不能是一个线段树上的一段,线段树为0到n,求最小的n是多少。
按照题目给出的区间向根部搜,由子区间推到父区间,有四种可能(左右区间和(l+r)的奇偶性):
[ l , 2*r-l ]
[ l , 2*r+1-l ]
[ (l-1)*2-r , r ]
[ (l-1)*2+1-r , r ]
按照这四种方式向上搜,加上剪枝就可以AC
原因是l/(r-l+1) <= 2015,那么每向上搜一次,下面的区间和会增加两倍,l/区间和也就会减少一半,一直到l/区间和小于1后,那么也就是不会再存在可能了,最多会搜22次,,
注意:剪枝的时候当前值>= n 就return,如果写>n会超时,,,,,sad
#include <cstdio> #include <cstring> #include <algorithm> using namespace std ; #define LL __int64 LL n ; void dfs(LL l,LL r) { if( l == 0 ) { if( n == -1 ) n = r ; else n = min(n,r) ; } if( n != -1 && r >= n ) return ; if( l < 0 ) return ; if( r-l+1 > (l-1)*2 ) return ; dfs((l-1)*2-r,r) ; dfs((l-1)*2+1-r,r) ; dfs(l,r*2-l) ; dfs(l,r*2+1-l) ; } int main() { LL l , r ; while( scanf("%I64d %I64d", &l, &r) != EOF ) { n = -1 ; dfs(l,r) ; printf("%I64d\n", n) ; } return 0 ; }
相关文章推荐
- sqoop 学习笔记
- sourceinsight常用快捷键和设置
- Mac 终端 常用命令总结2
- PHP 大数据量写入 csv文件 的一些代码片段
- 1. Perface
- css3字体效果
- Nodejs学习笔记(十一)--- 数据采集器示例(request和cheerio)
- res与res-auto的区别
- win7系统不兼容打不开零挂辅助该怎么办?
- PHP实现动态web服务器方法
- [线段树] poj3468 A Simple Problem with Integers
- windows上安装Mongodb提示主机拒绝
- Map接口的使用注意事项
- 解决IE下a标签点击有虚线边框的问题
- uva10051(dp 立方体塔, 拆分)
- python 进行Web接口测试实战
- Putty设置自己主动两次登录
- GCD基本使用
- html meta标签常用属性整理
- ecshop购买了某商品才能评价且只能评价一次