题目链接:

BD String

Time Limit: 2000/1000 MS (Java/Others)   

 Memory Limit: 65536/65536 K (Java/Others)

Problem Description
 
众所周知,度度熊喜欢的字符只有两个:B和D。

今天,它发明了一种用B和D组成字符串的规则:

S(1)=B

S(2)=BBD

S(3)=BBDBBDD

S(n)=S(n−1)+B+reverse(flip(S(n−1))

其中,reverse(s)指将字符串翻转,比如reverse(BBD)=DBB,flip(s)指将字符串中的B替换为D,D替换为B,比如flip(BBD)=DDB。

虽然度度熊平常只用它的电脑玩连连看,这丝毫不妨碍这台机器无与伦比的运算速度,目前它已经算出了S(21000)的内容,但度度熊毕竟只是只熊,一次读不完这么长的字符串。它现在想知道,这个字符串的第L位(从1开始)到第R位,含有的B的个数是多少?

 
Input
 
第一行一个整数T,表示T(1≤T≤1000) 组数据。

每组数据包含两个数L和R(1≤L≤R≤10^18) 。

 
Output
 
对于每组数据,输出S(21000)表示的字符串的第L位到第R位中B的个数。
 
Sample Input
 
3
1 3
1 7
4 8
 
Sample Output
 
2
4
3
 
题意:
 
 
思路:
 
L[i],R[i]分别表示node==i时这个串的左右端点,dp[i][0]表示node==i时B的个数,dp[i][1]表示D的个数;
给一个区间[l,r]进行分治,mid=(L[i]+R[i])/2,如果r<mid容易想,当l>mid时这时就可以把求node==i-1时的[l,r]的B的
个数转化成求node==i-1时的[l',r']的D的个数,在转化成求r'-l'-[l',r']里面的B的个数,递归就可以了,
当l<mid<r的时候就是把前面两个整合一下,详细看代码ba ;
 
 
AC代码:
 
  1. #include <bits/stdc++.h>
  2. /*
  3. #include <iostream>
  4. #include <queue>
  5. #include <cmath>
  6. #include <map>
  7. #include <cstring>
  8. #include <algorithm>
  9. #include <cstdio>
  10. */
  11. using namespace std;
  12. #define Riep(n) for(int i=1;i<=n;i++)
  13. #define Riop(n) for(int i=0;i<n;i++)
  14. #define Rjep(n) for(int j=1;j<=n;j++)
  15. #define Rjop(n) for(int j=0;j<n;j++)
  16. #define mst(ss,b) memset(ss,b,sizeof(ss));
  17. typedef long long LL;
  18. const LL mod=1e9+;
  19. const double PI=acos(-1.0);
  20. const int inf=0x3f3f3f3f;
  21. const int N=1e5+;
  22. int n;
  23. LL L[],R[],dp[][];
  24. int fun()
  25. {
  26. L[]=;
  27. R[]=;
  28. dp[][]=;
  29. dp[][]=;
  30. for(int i=;i<=;i++)
  31. {
  32. L[i]=;
  33. R[i]=*R[i-]+;
  34. dp[i][]=dp[i-][]++dp[i-][];
  35. dp[i][]=dp[i-][]+dp[i-][];
  36. }
  37. }
  38. LL dfs(LL l, LL r,int node)
  39. {
  40. if(l>r||node<)return ;
  41. if(l==L[node]&&r==R[node])return dp[node][];
  42. LL mid=(L[node]+R[node])>>;
  43. if(r<=mid)
  44. {
  45. if(r==mid)return +dfs(l,r-,node-);
  46. else return dfs(l,r,node-);
  47. }
  48. else
  49. {
  50. if(l>=mid)
  51. {
  52. if(l==mid)return r-l+-dfs(R[node]-r+,R[node]-l,node-);
  53. else return r-l+-dfs(R[node]-r+,R[node]-l+,node-);
  54. }
  55. else return dfs(l,mid-,node-)++r-mid-dfs(R[node]-r+,R[node]-mid,node-);
  56. }
  57. }
  58. int main()
  59. {
  60. int t;
  61. scanf("%d",&t);
  62. fun();
  63. while(t--)
  64. {
  65. LL l,r;
  66. scanf("%I64d%I64d",&l,&r);
  67. LL ans=dfs(l,r,);
  68. printf("%I64d\n",ans);
  69. }
  70. return ;
  71. }
 

hdu-5694 BD String(分治)的更多相关文章

  1. HDU 5694 BD String 迭代

    BD String 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5694 Description Problem Description 众所周知, ...

  2. HDU 5694——BD String——————【递归求解】

    BD String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  3. HDU 5694 BD String 递归暴力

    http://blog.csdn.net/angon823/article/details/51484906 #include <cstdio> #include <iostream ...

  4. hdu 5830 FFT + cdq分治

    Shell Necklace Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  5. hdu 4812 DTree (点分治)

    D Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Total S ...

  6. HDU 4054 Number String

    HDU 4054 Number String 思路: 状态:dp[i][j]表示以j结尾i的排列 状态转移: 如果s[i - 1]是' I ',那么dp[i][j] = dp[i-1][j-1] + ...

  7. BD String

    BD String Accepts: 388 Submissions: 1164 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/ ...

  8. HDU 5694 分治+规律

    http://acm.hdu.edu.cn/showproblem.php?pid=5694 此题一开始我也找到了规律,也知道是分治可是,,,想的太复杂了没写开, 我一直想的通过L,R两个参数分治,可 ...

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

    分析:按照题目所给的意思每次处理得到的新的字符串都是具有高度对称性的,举个例子,如题目所给的第三个字符串,最中间的是B然后两边分散开去,一边是B的话另外一边关于这个中心对称的那个位置一定是D,反过来同 ...

随机推荐

  1. 转载 使用WiX Toolset创建.NET程序发布Bootstrapper(安装策略管理)(一&二)——初识WiX

    转载fromVan Pan 的专栏   http://blog.csdn.net/rryqsh/article/details/8274832 http://blog.csdn.net/rryqsh/ ...

  2. [转]C语言文件输入/输出ACM改进版(freopen函数)

    C语言文件输入/输出ACM改进版(freopen函数) 2009年5月27日 10:379,457 浏览数发表评论阅读评论   文章作者:姜南(Slyar) 文章来源:Slyar Home (www. ...

  3. listView divider marginLeft marginRight

    要实现这样的效果: 新建drawable  用inset 进行实现.代码如下: <?xml version="1.0" encoding="utf-8"? ...

  4. c语言操作符 “++”另类行为

    正常情况下,我们使用++ int a = 1; a++; printf(“%d”,a); // 2; 很简单没什么好说的. #include <stdio.h>   int main() ...

  5. CMSIS RTOS -- embOS segger

    #ifndef __CMSIS_OS_H__ #define __CMSIS_OS_H__ #include <stdint.h> #include <stddef.h> #i ...

  6. 修改ThinkSNS网站入口

    1.先设置游客访问的黑/白名单,不需要开放的,可以注释掉.通过修改acesss.php文件. 2.修改OpenSociax.php文件实现.

  7. MySQL 4种日志

  8. codechef Arranging Cup-cakes题解

    Arranging Cup-cakes Our Chef is catering for a big corporate office party and is busy preparing diff ...

  9. Swift编程语言学习4.3—— 控制语句

    控制传递语句(Control Transfer Statements) 控制转移语句改变你代码的运行顺序,通过它你能够实现代码的跳转.Swift有四种控制转移语句. continue break fa ...

  10. hdu5072 2014 Asia AnShan Regional Contest C Coprime

    最后一次参加亚洲区…… 题意:给出n(3 ≤ n ≤ 105)个数字,每个数ai满足1 ≤ ai ≤ 105,求有多少对(a,b,c)满足[(a, b) = (b, c) = (a, c) = 1] ...