HDU5694 BD String(百度之星2A)
2016-05-24 22:53
337 查看
分析:
这道题比赛的时候居然wa了,实在是有点傻逼。这道题仔细想想就是一个递归,比赛的时候主要反转的操作没想清楚,其实只要再反转一次就好了,如果这一段多了x个数,那么这1...x中的B的个数对应原序列中x+1...n的D的数量,那么用sumB1...n−sumBx+1...n复杂度:o(64∗logn)
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <set> #include <map> #include <queue> #include <vector> #include <string> using namespace std; typedef long long LL; typedef vector <int> VI; typedef pair <int,int> PII; #define FOR(i,x,y) for(int i = x;i < y;++ i) #define IFOR(i,x,y) for(int i = x;i > y;-- i) #define pb push_back #define mp make_pair #define fi first #define se second LL query(LL x){ if(x == 0) return 0; LL sum = 1; FOR(i,0,100){ if(sum > x) {sum /= 2;break;} sum = sum*2+1; } //cout << x << ":" << sum <<endl; LL val = x-sum; LL ans = (sum+1)/2; if(val) ans ++; if(val > 1){ val --; LL len = sum-val; ans += sum/2-(len-query(len)); } return ans; } LL l,r; int main(){ //freopen("test.in","r",stdin); int T; scanf("%d",&T); while(T--){ scanf("%I64d%I64d",&l,&r); printf("%I64d\n",query(r)-query(l-1)); } return 0; }
相关文章推荐
- 有关数据库SQL递归查询在不同数据库中的实现方法
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#中的尾递归与Continuation详解
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- php递归创建目录的方法
- PHP递归创建多级目录
- Javascript递归打印Document层次关系实例分析
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件
- JavaScript的递归之递归与循环示例介绍
- C# 递归查找树状目录实现方法
- 全排列算法的非递归实现与递归实现的方法(C++)
- php递归列出所有文件和目录的代码
- java递归菜单树转换成pojo对象
- 一个JavaScript递归实现反转数组字符串的实例
- Java中的递归详解(用递归实现99乘法表来讲解)
- C语言的递归思想实例分析