码迷,mamicode.com
首页 > 其他好文 > 详细

ZOJ 3870 Team Formation

时间:2016-05-09 00:01:27      阅读:438      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

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 }

 

ZOJ 3870 Team Formation

标签:

原文地址:http://www.cnblogs.com/fenice/p/5472246.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!