码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 5694(BD String,折半递归)

时间:2016-05-22 19:59:38      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

 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,折半递归)

标签:

原文地址:http://www.cnblogs.com/zstu-jack/p/5517423.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!