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)——找规律字符串对称分治