Codeforces Gym 101484 K Counting Good Teams
2017-10-03 14:08
351 查看
原题链接:
http://codeforces.com/gym/101484/problem/K题意:
N个人,任选两个人组队,每个人有一个代表自己能力的二进制数值xi(输入中以十进制数的形式给出),如果两个人的二进制表示中都至少有一位,自己是1,对方是0,则这两个人可以组成一个good team,题目问有多少组good team。数据范围(N <= 1e5, xi < 2 ^ M, M <= 21)分析:
按位统计由题意显然可得,一个good team的两个成员i, j,(xi | xj) > xi && (xi | xj) > xj ,我们考虑相反的情况,即 (xi | xj) == max(xi, xj)。所以,我们只要枚举每个数xi,统计有多少满足(xj <= xi && xj | xi == xi)的数。
代码:
#include <bits/stdc++.h> using namespace std; const int maxn = 2100000 + 50; long long cnt[maxn], dn[maxn]; int main() { int n, m; scanf("%d %d", &n, &m); for (int i = 0; i < n; ++i) { int x; scanf("%d", &x); cnt[x]++; dn[x]++; } for (int i = 0; i < m; ++i) { for (int j = 0; j < (1 << m); ++j) { if ((j & (1 << i)) == 0) continue; dn[j] += dn[j ^ (1 << i)]; } } long long ans = (long long)(n - 1) * (long long)n / 2LL; for (int i = 0; i < (1 << m); ++i) { ans -= cnt[i] * dn[i] - (cnt[i] * (cnt[i] + 1) / 2); } cout << ans << endl; return 0; }
相关文章推荐
- Codeforces Gym 100203G G - Good elements 标记暴力
- Codeforces Gym 100203G G - Good elements 暴力
- Codeforces Gym - 101341A Streets of Working Lanterns - 2 [贪心]
- Codeforces gym 100792B Banana Brain's Bracelet - z-box算法
- CodeForces Gym 100187 A Potion of Immortality
- Codeforces Gym 100463D Evil DFS
- Codeforces Gym 100015H Hidden Code(暴力)
- Codeforces Gym 100513I I. Sale in GameStore 暴力
- CodeForces Gym 100500A A. Poetry Challenge DFS
- [高中数学联赛题] Codeforces Gym 101173 CERC 16 E. Easy Equation
- [构造] Codeforces Gym 101173 CERC 16 K & BZOJ 4796 Key Knocking
- Codeforces Gym 100623E Problem E. Enchanted Mirror
- Codeforces Gym 100425A Luggage Distribution 二分 数学
- Codeforces Gym 100203I I - I WIN 网络流最大流
- codeforces Gym 100338H High Speed Trains (递推,高精度)
- 【codeforces Gym - 100187K】+ 构造 + 贪心
- CodeForces Gym 100989F Mission in Amman (A)
- CodeForces Gym 100735G 二分图匹配
- CodeForces Gym 100735I 模拟题(可套大数版)
- codeforces gym-101755 D-Transfer Window 二分图匹配、递归