ACM_JLINE.

找集合

字数统计: 247阅读时长: 1 min
2019/09/29 Share

找集合

CF1230D

题目:

n 个数中找到一个集合,在二进制下第 i 位数为 1 的数不能只有 1 个。

解题思路:

如果一个数字出现两次及以上,就先加入集合。然后以这个集合去扩大。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#define ll long long
#define pii pair<int, int>
using namespace std;
const int N = 1e5 + 5;
const int Mod = 1e9 + 7;

int n;
ll a[N];
int b[N];
map <ll, int> cnt, v;

int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%lld", &a[i]);
cnt[a[i]]++;
}

for(int i = 1; i <= n; i++){
scanf("%d", &b[i]);
}

for(auto x : cnt){
if(x.second >= 2) v[x.first] = 1;
}

for(int i = 1; i <= n; i++){
for(auto x : v){
if((a[i] & x.first) == a[i]) v[a[i]] = 1;
}
}

ll sum = 0;
for(int i = 1; i <= n; i++){
if(v[a[i]]) {
// cout << a[i] << " ";
sum += b[i];
}
}
printf("%lld\n", sum);

return 0;
}
CATALOG
  1. 1. 找集合
    1. 1.1. CF1230D