题目链接:

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. 转载:Flash AS3.0 加载外部资源(图片,MP3,SWF)的两种方式

    Flash AS3.0 加载外部资源(图片,MP3,SWF)的两种方式 出自:http://www.cnblogs.com/top5/archive/2012/08/04/2623464.html 关 ...

  2. java懒汉式单例遇到多线程

    单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功 ...

  3. HTML定位(滚动条、元素,视口)定位

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. state与status的区别

    status 指人时暗指相对的地位,指物时相当于 situation.situation 较狭义地指由环境综合决定的特定时间上的状态或情形. state 人或物存在或所处的状态,和 condition ...

  5. 学会自己写jQuery插件(一)---基础

    第一步:定义插件 $(function() { $.fn.插件名称 = function(options) { var defaults = { Event : "click", ...

  6. Bootstrap 教程

    Bootstrap,来自 Twitter,是基于 HTML.CSS.JAVASCRIPT 的简介灵活的流行前段框架及交互组件集. 内容列表 Bootstrap 教程 Bootstrap 教程 Boot ...

  7. (高精度运算4.7.27)UVA 10494 If We Were a Child Again(大数除法&&大数取余)

    package com.njupt.acm; import java.math.BigInteger; import java.util.Scanner; public class UVA_10494 ...

  8. 免费LInux主机资源

    一.m-net.arbornet.org注冊 (1)telnet m-net.arbornet.org vista系统默认是关闭telnet的(由于不安全),须要开启.cmd->telnet(2 ...

  9. Android Compatibility package 兼容性开发套件

    我们认为Android 3.0平板电脑操作系统在美国时间2011年2月22日的正式推出,对于Android手机应用程序开发者所象征的意涵是: 之前大家所开发过的Android手机应用,除了可以在And ...

  10. JavaScript Design Patterns: Mediator

    The Mediator Design Pattern The Mediator is a behavioral design pattern in which objects, instead of ...