您的位置:首页 > 其它

ZOJ-3870-Team Formation

2017-04-12 09:35 253 查看
点击打开题目链接

/*
异或运算中 同0异1,要求得x = max(x1, x2),则应使得x1[pos] = 1&&x2[pos] = 0(pos为x1的最高位);
*/
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>

using namespace std;

const int Max = 1e5 + 10;
int a[Max];
int bit[50];//最高位在当前位置的数的个数
int f[Max];//对于数x的最高位的位置
/*
作用:寻找数x的最高位的位置pos,并累加bit[pos];
*/
void solve(int x,int i)
{
int pos = 30;
while(pos>=0)
{
if(x&(1<<pos))
{
bit[pos] ++;
f[i] = pos;
return;
}
pos--;
}
}
int main()
{
int T,n;
cin>>T;
while(T--)
{
memset(bit,0,sizeof(bit));
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
solve(a[i],i);
}

int sum = 0 ;
for(int i=0; i<n; i++)
{
int pos = f[i];
while(pos>=0)
{
if(!(a[i]&(1<<pos)))
sum += bit[pos];
pos--;
}
}
cout<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: