ZOJ—3870 (位运算)

来源:互联网 发布:大数据时代是什么意思 编辑:程序博客网 时间:2024/06/08 13:24

比赛时没想到,位运算的话还是要转化成二进制来寻找规律啊。。。。


题意很简单:给出一串数字,如果x和y的x^y>max(x,y)的话就是满足条件的一组,求一共有多少组。

/*对于一个数,如果我们把x的二进制表示中最高位的0变成1,0前面的都不变,那么得到的这个新值肯定比x大。即:如果x的第i位为1(i为x的最高位的1所在位置),y的第i位为0(i不是y的最高位所在位置),那么z=x^y之后,z > max(x, y)。*/#include <iostream>#include <cstdio>#include <cstring>#include <string.h>using namespace std;const int maxn = 100000+5;int b[maxn];//b[i]代表最高位位于l的元素的个数int s[maxn];int t;int n;void Init(int  x){    int l=31;    while(l>=0)//从高到低查找    {        if(x & (1<<l))        {            b[l]++;            return ;        }        l--;    }}int main(){    scanf("%d",&t);    while(t--)    {        memset(b,0,sizeof(b));        scanf("%d",&n);        for(int i=0;i<n;i++)        {            scanf("%d",&s[i]);            Init(s[i]);        }        int ans=0;        for(int i=0;i<n;i++)        {            int l=31;            while(l>=0)//找当前的s[i]的最高位位于何处            {                if(s[i]& (1<<l)) break;                l--;            }            while(l>=0)//从最高位向下查找满足的,如果当前位满足就ans就加上它            {                if(!(s[i]&(1<<l)))                {                    ans+=b[l];                }                l--;            }        }        cout << ans <<endl;    }    return 0;}


0 0
原创粉丝点击