标签:
题目链接:点击打开链接
题目大意:给出一个区间[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 ; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu5323(2015多校3)--Solve this interesting problem(万万没想到,,,)
标签:
原文地址:http://blog.csdn.net/winddreams/article/details/47127407