您的位置:首页 > 其它

HDU 5969 最大的位或

2017-10-17 09:29 316 查看
题意:

中文题。

思路:

对于每种情况,如果l与r的二进制位数不等,那么必定可以构造成:

10000

  1111 的形式。

对于二进制位数相等,那么我们就可以保留前几位相等的,在某一最高位不等的情况下,把次高位~1 全都补成1

pow..损精度,,WA哭了

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
long long a[1000], b[1000];
ll tt[4100];
int main()
{
ll c=1;
for(int i=1;i<=63;i++)
{
tt[i]=c;
c<<=1;
}
int t;
cin>>t;
while(t--)
{
int cnta=0,cntb=0;
ll num1,num2;
cin>>num1>>num2;
if(num1>num2)
swap(num1,num2);
memset(a,0,sizeof a);
memset(b,0,sizeof b);
while(num1)
{
a[++cnta]=num1%2;
num1/=2;
}
while(num2)
{
b[++cntb]=num2%2;
num2/=2;
}
ll res=0;
if(cnta!=cntb)
{
int maxx=max(cnta,cntb);
ll k=1;
for(int i=1; i<=maxx; i++)
{
res+=k;
k<<=1;
}
cout<<res<<endl;
}
else
{
int flag=0;
for(int i=cnta; i>=1; i--)
{
if(a[i]!=b[i])
{
flag=i;
break;
}
}
ll k=1;
for(int i=1; i<=flag; i++)
{
res+=k;
k<<=1;
}
for(ll i=cnta; i>flag; i--)
{
if(b[i]!=0)
res+=tt[i];
}
cout<<res<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: