ZOJ 3870 Team Formation

题目链接:

http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=3870

题解:

如果x xor y>max(x,y),那么就会有x和y的最高位不同(二进制表示),并且对于最高位小的那个数的最高位的位置,最高位大的那个数在相同的位置应为0.

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 typedef long long LL;
 7 const int maxn = 1e5 + 10;
 8 
 9 int n;
10 
11 int arr[maxn];
12 //cnt[i]表示最高位为i的数有多少个
13 int cnt[32];
14 
15 void init() {
16     memset(cnt, 0, sizeof(cnt));
17 }
18 
19 int main() {
20     int tc;
21     scanf("%d", &tc);
22     while (tc--) {
23         init();
24         scanf("%d", &n);
25         for (int i = 0; i<n; i++) {
26             scanf("%d", &arr[i]);
27             for (int j = 30; j >= 0; j--) {
28                 if ((1 << j)&arr[i]) {
29                     cnt[j]++; break;
30                 }
31             }
32         }
33         LL ans = 0;
34         for (int i = 0; i<n; i++) {
35             int j;
36             for (j = 30; j >= 0; j--) {
37                 if ((1 << j)&arr[i]) {
38                     break;
39                 }
40             }
41             for (j -= 1; j >= 0; j--) {
42                 if (((1 << j)&arr[i]) == 0) {
43                     ans += cnt[j];
44                 }
45             }
46         }
47         printf("%lld\n", ans);
48     }
49     return 0;
50 }

 

posted @ 2016-05-08 23:17  fenicnn  阅读(130)  评论(0编辑  收藏  举报