题目链接:

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代码:
 
#include <bits/stdc++.h>
/*
#include <iostream>
#include <queue>
#include <cmath>
#include <map>
#include <cstring>
#include <algorithm>
#include <cstdio>
*/
using namespace std;
#define Riep(n) for(int i=1;i<=n;i++)
#define Riop(n) for(int i=0;i<n;i++)
#define Rjep(n) for(int j=1;j<=n;j++)
#define Rjop(n) for(int j=0;j<n;j++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
typedef long long LL;
const LL mod=1e9+;
const double PI=acos(-1.0);
const int inf=0x3f3f3f3f;
const int N=1e5+;
int n;
LL L[],R[],dp[][];
int fun()
{
L[]=;
R[]=;
dp[][]=;
dp[][]=;
for(int i=;i<=;i++)
{
L[i]=;
R[i]=*R[i-]+;
dp[i][]=dp[i-][]++dp[i-][];
dp[i][]=dp[i-][]+dp[i-][];
}
}
LL dfs(LL l, LL r,int node)
{
if(l>r||node<)return ;
if(l==L[node]&&r==R[node])return dp[node][];
LL mid=(L[node]+R[node])>>;
if(r<=mid)
{
if(r==mid)return +dfs(l,r-,node-);
else return dfs(l,r,node-);
}
else
{
if(l>=mid)
{
if(l==mid)return r-l+-dfs(R[node]-r+,R[node]-l,node-);
else return r-l+-dfs(R[node]-r+,R[node]-l+,node-);
}
else return dfs(l,mid-,node-)++r-mid-dfs(R[node]-r+,R[node]-mid,node-);
}
}
int main()
{
int t;
scanf("%d",&t);
fun();
while(t--)
{
LL l,r;
scanf("%I64d%I64d",&l,&r);
LL ans=dfs(l,r,);
printf("%I64d\n",ans);
}
return ;
}
 

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. Fragment实现底部选项卡切换效果

    现在很多APP的样式都是底部选项卡做为首页的,实现这样的效果,我们一般有这样几种方式,第一,最屌丝的做法,我直接自定义选项卡视图,通过监听选项卡视图,逻辑控制内容页的切换,这样做的想法一般是反正这几个 ...

  2. CMSIS Example - osMessageQ osMessagePut osMessageGet

    #include "cmsis_os.h" void Thread0( void * arg); void Thread1( void * arg); osThreadDef( T ...

  3. 使用jquery获取父元素或父节点的方法

    今天面试题问到了,没答上,jq要继续学习啊 jquery获取父元素方法比较多,比如parent(),parents(),closest()这些都能帮你实现查找父元素或节点,下面我们来一一讲解: 先举个 ...

  4. java android ExecutorService 线程池解析

    ExecutorService: 它也是一个接口,它扩展自Executor接口,Executor接口更像一个抽象的命令模式,仅有一个方法:execute(runnable);Executor接口简单, ...

  5. scu 4436: Easy Math 水题

    4436: Easy Math Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.scu.edu.cn/soj/problem.actio ...

  6. C#打包制作安装程序过程全记录

    该文是根据网上的文章并结合自己实际打包的过程而整理的. 开发平台:VisualStudio2005中文版. 步骤如下: 1. 创建一个安装向导项目或安装部署项目 新建项目-〉其他项目类型-〉安装与部署 ...

  7. vs 设置生成的实体为复数

  8. android手势事件 快速移动 长按触摸屏 按下触摸屏,并拖动

    /* 用户按下触摸屏.快速移动后松开 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float vel ...

  9. 利用URLScan工具过滤URL中的特殊字符(仅针对IIS6)

    客户公司搞安全检查,扫描出来我们之前做的系统有一个高危漏洞:IIS tilde directory enumeration,也就是利用“~”字符猜解暴露短文件/文件夹名,比如,采用这种方式构造URL: ...

  10. 基于HTML5实现的中国象棋游戏

    棋类游戏在桌面游戏中已经非常成熟,中国象棋的版本也非常多.今天这款基于HTML5技术的中国象棋游戏非常有特色,我们不仅可以选择中国象棋的游戏难度,而且可以切换棋盘的样式.程序写累了,喝上一杯咖啡,和电 ...