【打表枚举+二分】喜爱
喜爱
题目描述:
小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
*/
【打表枚举+二分】喜爱相关推荐
- BinarySearch 有序表的二分查找
BinarySearch 有序表的二分查找 思路: 前提是线性表采用顺序存储(通常从小到大),然后在有序表中取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功:若小于,则在中间记录的左 ...
- lintcode-106-排序列表转换为二分查找树
106-排序列表转换为二分查找树 给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树 样例 标签 递归 链表 思路 类似于二分查找,每次将链表二分,中间节点作为根节点,在建立左子树 ...
- 对长度为200的有序表进行二分查找_程序员常用的查找算法(顺序、二分、插值、分块、斐波那契)...
顺序查找 基本思想 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素. 这是最基本的查找方法,也是时间复杂度最高的查找算法. 在数据过多时,这种方法并不适用. 代码实现 ...
- 【HDU 5936 --- Difference】折半枚举+二分
[HDU 5936 --- Difference]折半枚举+二分 Description Little Ruins is playing a number game, first he chooses ...
- MySQL建表枚举分区SQL,【mysql备份】02、Xtrabackup备份mysql
一.Xtrabackup概述 1.Xtrabackup简介 Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb ...
- Subset POJ - 3977(折半枚举+二分+二进制枚举)
题意: 给你一个集合N(N<=35),问集合的子集,除了空集,使得自己中所有元素和的绝对值最小,若存在多个值,那么选择子集中元素最少的那个. 题目: Given a list of N inte ...
- 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) 给我们这个等式让我们找出这里面有多少 ...
- 超大背包问题(二进制枚举 + 二分)
超大背包问题 第一次看到这一题好像是在某一场比赛,就是给你一个炸空间和时间的背包,让你选最大的价值,看似是01背包然鹅今天在挑战程序设计这本书上看到了这题,看到了作者的做法,感觉豁然开朗,直接暴搜也会 ...
- zstu新生赛 Problem A: Baby Coins(折半枚举+二分)
Problem A: Baby Coins Time Limit: 1 Sec Memory Limit: 128 MB Submit: 274 Solved: 29 Description Baby ...
最新文章
- java手机界面太小_手机端页面在项目中遇到的一些问题及解决办法
- 无人驾驶系列】光学雷达(LiDAR)在无人驾驶技术中的应用
- python numpy库等差不均分_numpy.linspace 生成等差数组的方法
- day24-1 元类
- 随机生成数组函数+nth-element函数
- android hide方法 末班,android 如何引用@hide(隐藏)的类,方法和常量?
- laravel 服务提供者
- 6年20多篇重磅论文,27岁浙大女博导太飒了~
- 使用java实现rfc3161,openssl验证用自签名证书签名的RFC3161时间戳
- 不怂Java进制转换(洛谷P1143题题解,Java语言描述)
- php.ini添加的变量读取,PHP5 在扩展里使用 INI 指令(直接添加和配合全局变量两种方式)...
- 使用小波变换进行Pan和多光谱融合
- selenium 下载
- 初学者如何快速入门深度学习?
- 一个商品SKU是怎么生成的
- cocos2dx图片闪亮_SassDoc 2-闪亮的流章鱼出来了!
- 怎么给PDF添加页面?推荐三个PDF如何插入页面小妙招
- UE4使用委托实现Actor之间的通信
- 利用机器学习实施网络犯罪 6种有效途径触目惊心
- RBA验厂咨询,RBA认证6.0有哪三个章节名称调整及行为准则改变要点说明