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;
}
/*
异或运算中 同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;
}
相关文章推荐
- ZOJ 3870 Team Formation
- ZOJ-3870 Team Formation
- ZOJ 3870 Team Formation
- ZOJ 3870 Team Formation
- 【ZOJ 3870】 Team Formation
- ZOJ 3872 Beauty of Array&&ZOJ 3870 Team Formation
- zoj 3870 Team Formation
- ZOJ 3870 Team Formation
- zoj 3870 Team Formation
- 位运算 ZOJ 3870 Team Formation
- ZOJ - 3870 Team Formation (二进制)
- ZOJ 3870 Team Formation
- ZOJ 3870 Team Formation(浙江省第12届ACM省赛第二题)
- zoj 3870 Team Formation (数位统计问题)
- ZOJ - 3870
- ZOJ 3870
- ZOJ 3870(数学)
- Zoj 3870 Team Formation(异或运算)
- ZOJ 3870:Team Formation【技巧】
- zoj 3870 贪心