hdu5969最大的位或(二进制思维)

来源:互联网 发布:外商投资网络支付机构 编辑:程序博客网 时间:2024/04/27 12:52

题意:

给你一个区间[l,r],从中取两个数,使得或值最大。

思路:

把左右区间转化为二进制排列,从高位开始比较,若出现不同,说明后面的数都能取到1(出现不同的情况,必定是右区间的位为1,左区间的位为0(因为l<=r),所以必能选出一个x(l<=x<=r),使得往后的位都为1)

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <map>#include <vector>#include <cmath>using namespace std;typedef long long ll;const ll INF = 0x3f3f3f3f;const ll INFF = 0x3f3f3f3f3f3f3f3f;const ll mod = 1e9+7;int a[70],b[70];int main(){    int t;    scanf("%d",&t);    while(t--)    {        ll l,r;        scanf("%lld%lld",&l,&r);        for(int i = 63;i>=0;i--)        {            ll s = 1;            s<<=i;            if(s&l)                a[i] = 1;            else                a[i] = 0;            if(s&r)                b[i] = 1;            else                b[i] = 0;        }        ll ans = 0;        int j = 63;        for(j = 63;j>=0;j--)        {            if(a[j]==b[j])            {                ll s = 1;                s<<=j;                ans+=s*a[j];            }            else                break;        }        while(j>=0)        {            ll s = 1;            s<<=j;            ans += s;            j--;        }        printf("%lld\n",ans);    }    return 0;}

原创粉丝点击