博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
G:区间或和(思维)
阅读量:3899 次
发布时间:2019-05-23

本文共 1308 字,大约阅读时间需要 4 分钟。

【...】

是寒假做的题解,但是不知道什么时候设置成私密了,奇奇怪怪的

【题解】

这道题真的绊了我很久很久...但是通过量好高啊...于是

我们知道只有0|0才是0,把a,b化成二进制先按位或一遍,然后我们可以发现每2^(i-1)个数可以把第i位从0->1,如果a的二进制数的位数小于b,那么显然可以把b的第一位后边的每一位都或成1。

当然我们知道肯定有更简便合理的做法(哭了我真是太菜了),如下:

法一:两个不相同的数做或运算只会变大,a+1至少1位要进行改变,a|(a+1)每次起码多补1位0,直到当前数字超过b为止。

法二:如果a和b的二进制位数一样,那么直接从左往右找到第一个不相同的数字,然后把后面所有的数都变成1,这个就是答案(因为从a到b过程中,后面的所有位都会0到1到0的变化,所以后面的数都是1)。如果a和b的位数不相同,那么答案就是b的最高位为1并且后面都是1,即2^(b的位数)-1。(代码我就不写了因为好像也没有那么简便hhh)

【法一】

int main(){    long long a,b;    while(cin>>a>>b)    {        while(a

【原代码】

#include
#define mem(a,b) memset(a,b,sizeof(a))using namespace std;typedef long long ll;int cul(ll x){ int c=0; while(x) { c++; x/=2; } return c;}int main(){ ll a,b; while(~scanf("%lld%lld",&a,&b)) { int c1=cul(a),c2=cul(b); if(c2>c1) b=(ll)pow(2,c2)-1; else { ll c=b-a,t=1; queue
q; while(b) { int x=a%2,y=b%2; if(x==0&&y==0&&t>c) q.push(0); else q.push(1); a/=2,b/=2; t*=2; } t=1; while(!q.empty()) { if(q.front()==1) b=b|t; q.pop(); t*=2; } } printf("%lld\n",b); } return 0;}

 

转载地址:http://xfben.baihongyu.com/

你可能感兴趣的文章
PAT---B1037. 在霍格沃茨找零钱(20)
查看>>
PAT---A1019. General Palindromic Number (20)
查看>>
PAT---A1027. Colors in Mars (20)
查看>>
PAT---1058. A+B in Hogwarts (20)
查看>>
PAT---A1001. A+B Format (20)
查看>>
PAT---A1005. Spell It Right (20)
查看>>
PAT---A1035. Password (20)
查看>>
PAT---A1077. Kuchiguse (20)
查看>>
PAT---A1062. Talent and Virtue (25)
查看>>
PAT---A1012. The Best Rank (25)
查看>>
数据库SQL语言语法总结3---查询语句
查看>>
数据库SQL语言语法总结4---数据更新
查看>>
数据库SQL语言语法总结5---视图
查看>>
数据库SQL语言语法总结6---数据控制
查看>>
数据库SQL语言语法总结1---表操作
查看>>
Numpy中stack(),hstack(),vstack()函数详解
查看>>
基于3D卷积神经网络的行为识别
查看>>
K.function用法
查看>>
keras -- multi-loss
查看>>
pytorch数据增强的具体细节
查看>>