• HDU 5694 BD String 迭代


    BD String

    题目连接:

    http://acm.hdu.edu.cn/showproblem.php?pid=5694

    Description

    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≤1018) 。

    Output

    对于每组数据,输出S(21000)表示的字符串的第L位到第R位中B的个数。

    Sample Input

    3
    1 3
    1 7
    4 8

    Sample Output

    2
    4
    3

    Hint

    题意

    题解:

    假设我知道了solve(i),表示求i之前有多少个b

    那么答案就是solve(r)-solve(l-1)嘛

    这个怎么实现呢?不停迭代下去就好了……

    因为你S[i] = s[i-1]+1+rs[i-1]

    这个可以迭代的,复杂度是logn的,具体看get函数的代码吧……

    代码

    #include<stdio.h>
    #include<algorithm>
    #include<math.h>
    #include<queue>
    #include<cstring>
    #include<iostream>
    using namespace std;
    const int maxn = 61;
    long long len[maxn],B[maxn],D[maxn],sumB[maxn];
    void pre()
    {
        len[1]=B[1]=sumB[1]=1;
        for(int i=2;i<maxn;i++){
            len[i]=2LL*len[i-1]+1;
            B[i]=D[i-1]+1+B[i-1];
            D[i]=B[i-1]+D[i-1];
        }
    }
    long long get(long long x)
    {
        if(x==0)return 0;
        if(x==1)return 1;
        int p=lower_bound(len+1,len+61,x)-len;
        if(x==len[p])return B[p];
        if(x>=(len[p-1]+1)/2+1+len[p-1])
            return B[p-1]+1+get(x-len[p-1]-1)-1;
        return B[p-1]+1+get(x-len[p-1]-1);
    }
    void solve()
    {
        long long l,r;
        scanf("%lld%lld",&l,&r);
        cout<<get(r)-get(l-1)<<endl;
    }
    int main()
    {
        pre();
        int t;
        scanf("%d",&t);
        while(t--)solve();
        return 0;
    }
  • 相关阅读:
    【mybatis-SqlSession的方法总结】
    【项目中遇到的一点问题】
    【request获取用户请求ip】
    【Linux入门】
    【linux学习-centeros】
    java Map 映射
    Java Set接口
    Java 泛型
    Java集合框架---重构设计
    Java 数据结构之双链表
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5516321.html
Copyright © 2020-2023  润新知