hdu 5694(BD String,折半递归)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 5694(BD String,折半递归)相关的知识,希望对你有一定的参考价值。

 1 #include <bits/stdc++.h>
 2 #define lld I64d
 3 using namespace std;
 4 typedef long long ll;
 5 vector<ll> vec;
 6 /**
 7  *lower_bound 返回大于或等于x 位置的指针
 8  *
 9  * 思路:先预处理出对称的下标放入vector
10  *         dfs(x) 表示 1-x 中 B的个数
11  *         (1)若x正好等于vec[i], 则 B 的个数 = vec[i-1]/2 + 1; (对称性)
12  *         (2)否则, 在加上以vec[i-1]为对称左右到x的距离(x-vec[i-1])的B的个数后
13  *             再搜索 前面的
14  * 
15  * */
16 
17 void init(){
18     ll tmp = 1;
19     while(tmp <= (ll)1e18){
20         vec.push_back(tmp);
21         tmp = tmp * 2;
22     }
23 }
24 ll dfs(ll x){
25     if(x == 0) return 0;
26     int index = lower_bound(vec.begin(),vec.end(),x) - vec.begin();
27     if(vec[index] == x)    return x / 2 + 1;
28     ll t = x - vec[index-1];
29     return t + 1 + dfs(x - 2 * t - 1);
30 }
31 int main(){
32     int T;
33     init();
34     scanf("%d",&T);
35     while(T--){
36         ll l,r;
37         scanf("%lld%lld",&l,&r);
38         ll ans = dfs(r) - dfs(l-1);
39         printf("%lld\n",ans);
40     }
41     return 0;
42 }
43 /*B
44  *1234567 8 9 
45  *BBD
46    . 
47  *BBDBBDD
48       .    
49  *BBDBBDD B BBDDBDD
50    |   |  .   |
51  * */

 

以上是关于hdu 5694(BD String,折半递归)的主要内容,如果未能解决你的问题,请参考以下文章

2016"百度之星" - 初赛(Astar Round2A)1005 BD String(HDU5694)——找规律字符串对称分治

简单规律---BD String

HDU 5694 分治+规律

C语言折半查找之递归算法

用递归法写一个折半查找的算法

基础算法|6 折半插入排序 - HDU 1412