喜爱

题目描述:

小s最近对数字情有独钟。他又发现了一种神奇的数字。对于数x,如果它二进制表示中只有一位是0,则x就会被小s所喜爱。比如5,二进制为101,则它被小s所喜爱。
现在,小s想知道,对于一个区间[L,R],有多少数是他所喜爱的。

输入:

输入包含多组数据。
输入第一行T,表示数据组数。
每组数组仅有一行,包含两个正整数[L,R]。

输出:

对于每组数据输出一行,表示答案。

样例输入 :

2
5 10
2015 2015

样例输出 :

2
1

提示:

对于30%的数据:L,R≤106,T≤10L,R≤10^6,T≤10L,R≤106,T≤10
对于60%的数据:L,R≤1010,T≤100L,R≤10^{10},T≤100L,R≤1010,T≤100
对于100%的数据:L,R≤1018,T≤10000L,R≤10^{18},T≤10000L,R≤1018,T≤10000

解题思路:找出二进制表示的情况下,所有位数都为1的情况,即就是2的幂减1就是了。然后拿这个数分别减指数比他的指数至少低2的所有情况,然后一一列举出来就是了,表建好之后,再来个for循环就ok
例如

对于这道题的话,我写了两个代码,不过有一个是辅助性代码,就是为了检验我打的表是否正确而建的,在这里我把两个代码都附上吧;

代码一(检验建表数据是否正确的暴力代码)

#include<bits/stdc++.h>
using namespace std;
string trans(int x)
{string a;while(x){a+=(x%2)+48;x/=2;}reverse(a.begin(),a.end());return a;
}
bool judge(string a)
{int count1=0;for(int i=0;i<a.size();i++){if(a[i]=='0')count1++;}if(count1==1) return true;else return false;
}
int main()
{for(int i=1;i<=100;i++){cout<<trans(i)<<" ";if(judge(trans(i))) cout<<i;cout<<endl;}return 0;
}

*运行截图也带上 *

代码二(AC代码):

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll st[1001011];
ll qpow(ll a,ll b)
{ll ans=1;while(b){if(b&1){ans=ans*a;b--;}a=a*a;b/=2;}return ans;
}
int main()
{ll k=0,i,j;for(i=1;i<=60;i++){ll temp=qpow(2,i)-1;for(j=0;j<i-1;j++)st[k++]=temp-qpow(2,j);}sort(st,st+k);
//  cout<<st[k-1];
//  cout<<k<<endl;  k=1770
//  for(i=0;i<k;i++)  //检验数据
//  {//      cout<<st[i]<<endl;
//  } ll t,L,R;scanf("%lld",&t);while(t--){scanf("%lld%lld",&L,&R);i=0;ll count1=0;while(st[i]<L) i++;for(;i<k;i++){if(st[i]>R) break;count1++;}printf("%lld\n",count1);}return 0;
}

代码里我用了无符号型的long long 因为我看到数据范围是1e18,我怕爆数据,所以就整上了unsigned,但是后来同学告诉我说直接long long 也能过,一看我的代码,诶呀,虽说定义了无符号类型,但还是用的%lld,自我觉得也是用的普通的long long 的范围,网上搜一下也会发现,long long的最大值确实会比101810^{18}1018大一些,用幂的形式来表示的话是 263−12 ^{63}-1263−1,我打表的情况是2602 ^{60}260 所以,也不用担心爆了。
时间复杂度的话,感觉我这个挺牵强的,正好卡过,T的范围1e4,打表的数据一共有1770个,所以就是O(1e4*1770) 差不多2e7了,卡过也实属运气呀!哈哈哈哈。。。

不对不对,又看了一眼评测结果,50ms,,挺快呀,说明什么,代码复杂度还是挺低的嘛,可能是我复杂度算错了,交的时候都是小心翼翼的,就怕被T,可吓死我了,,大佬路过的的话帮忙指点一下复杂度是多少呀,我不会算qwq,非常感谢!!!

2021.03.13 updata.
对于上述代码中可以加上二分进行进一步的优化。
二分优化代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll st[1800], s;
ll qpow(ll a, ll b)
{ll res = 1;while (b){if (b & 1) res = 1ll * res * a;a = 1ll * a * a;b >>= 1;}return res;
}
int main()
{//freopen("7.in","r",stdin);//freopen("7.out","w",stdout);for (int i = 1;i <= 60;i++){ll temp = qpow(2, i) - 1;for (int j = 0;j < i - 1;j++)st[++s] = temp - qpow(2, j);}sort(st + 1, st + s + 1);//for(int i=1;i<=s;i++) cout << st[i] << endl;int t;ll L, R;scanf("%d", &t);while (t--){scanf("%lld%lld", &L, &R);int l = lower_bound(st + 1, st + s + 1, L) - st;int r = upper_bound(st + 1, st + s + 1, R) - st - 1;printf("%d\n", r - l + 1);}return 0;
}
/*
1
10
11
100
101
110
111
1000
1001
1010
1011
1100
1101
1110
1111
*/

【打表枚举+二分】喜爱相关推荐

  1. BinarySearch 有序表的二分查找

    BinarySearch 有序表的二分查找 思路: 前提是线性表采用顺序存储(通常从小到大),然后在有序表中取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功:若小于,则在中间记录的左 ...

  2. lintcode-106-排序列表转换为二分查找树

    106-排序列表转换为二分查找树 给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树 样例 标签 递归 链表 思路 类似于二分查找,每次将链表二分,中间节点作为根节点,在建立左子树 ...

  3. 对长度为200的有序表进行二分查找_程序员常用的查找算法(顺序、二分、插值、分块、斐波那契)...

    顺序查找 基本思想 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素. 这是最基本的查找方法,也是时间复杂度最高的查找算法. 在数据过多时,这种方法并不适用. 代码实现 ...

  4. 【HDU 5936 --- Difference】折半枚举+二分

    [HDU 5936 --- Difference]折半枚举+二分 Description Little Ruins is playing a number game, first he chooses ...

  5. MySQL建表枚举分区SQL,【mysql备份】02、Xtrabackup备份mysql

    一.Xtrabackup概述 1.Xtrabackup简介 Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb ...

  6. Subset POJ - 3977(折半枚举+二分+二进制枚举)

    题意: 给你一个集合N(N<=35),问集合的子集,除了空集,使得自己中所有元素和的绝对值最小,若存在多个值,那么选择子集中元素最少的那个. 题目: Given a list of N inte ...

  7. HDU-4282 A very hard mathematic problem 技巧枚举+二分

    题意 xz+yz+x∗y∗z=kx^z+y^z+x*y*z = k ( y>x&&z>1y>x&&z>1) 给我们这个等式让我们找出这里面有多少 ...

  8. 超大背包问题(二进制枚举 + 二分)

    超大背包问题 第一次看到这一题好像是在某一场比赛,就是给你一个炸空间和时间的背包,让你选最大的价值,看似是01背包然鹅今天在挑战程序设计这本书上看到了这题,看到了作者的做法,感觉豁然开朗,直接暴搜也会 ...

  9. zstu新生赛 Problem A: Baby Coins(折半枚举+二分)

    Problem A: Baby Coins Time Limit: 1 Sec Memory Limit: 128 MB Submit: 274 Solved: 29 Description Baby ...

最新文章

  1. java手机界面太小_手机端页面在项目中遇到的一些问题及解决办法
  2. 无人驾驶系列】光学雷达(LiDAR)在无人驾驶技术中的应用
  3. python numpy库等差不均分_numpy.linspace 生成等差数组的方法
  4. day24-1 元类
  5. 随机生成数组函数+nth-element函数
  6. android hide方法 末班,android 如何引用@hide(隐藏)的类,方法和常量?
  7. laravel 服务提供者
  8. 6年20多篇重磅论文,27岁浙大女博导太飒了~
  9. 使用java实现rfc3161,openssl验证用自签名证书签名的RFC3161时间戳
  10. 不怂Java进制转换(洛谷P1143题题解,Java语言描述)
  11. php.ini添加的变量读取,PHP5 在扩展里使用 INI 指令(直接添加和配合全局变量两种方式)...
  12. 使用小波变换进行Pan和多光谱融合
  13. selenium 下载
  14. 初学者如何快速入门深度学习?
  15. 一个商品SKU是怎么生成的
  16. cocos2dx图片闪亮_SassDoc 2-闪亮的流章鱼出来了!
  17. 怎么给PDF添加页面?推荐三个PDF如何插入页面小妙招
  18. UE4使用委托实现Actor之间的通信
  19. 利用机器学习实施网络犯罪 6种有效途径触目惊心
  20. RBA验厂咨询,RBA认证6.0有哪三个章节名称调整及行为准则改变要点说明

热门文章

  1. Windows下缺少Android licenses的奇怪路径问题
  2. 钢琴五线谱 学习分享(兴趣爱好)
  3. 纹波(ripple)--学习笔记
  4. 为什么要学习西方文化
  5. html5人脸拼图,layout拼图
  6. python电话_Python短信电话报警
  7. 电力电子pwm控制技术
  8. ArcEngine实现要素类排序的四种方法
  9. html css标记文本,HTML图像标记和CSS核心基础和文本相关样式
  10. 模型预测控制(MPC)解析(六):有约束的MPC简介