D. Marcin and Training Camp
题目链接:http://codeforces.com/contest/1230/problem/D
time limit per test:
3 secondsmemory limit per test:
256 megabytesinput:
standard inputoutput:
standard output题目大意:
要组建一个小组,要求小组中每个人都不比所有人强,当一个人懂得一个算法但是另一个不懂那么前者认为他比后者强。所以这个小组要满足一个人懂得算法必定有另一个人全懂。每个人的技能是不同的,要求出这个小组能组成的技能最大值。
解题思路:
这个小组懂得最多算法的那个人必定有另一个人与他懂的算法一样。所以记录所有ai相同的人的ai。可以知道,当一个人比另一个人的ai小且他们的与运算等于小的那个人的ai那么可以知道大的那个人必定强于ai小的那个人。也就是ai小的那个人会的算法另一个人都会。知道了小组中必定有哪些人那么用其他人和这些人比较就可以得到最后小组有哪些人。
代码:
1 #include <bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 const int N=1e5;
5 ll arr1[N];
6 ll arr2[N];
7 ll vis[N];
8 map<ll,ll>cnt;
9 vector<ll >arr;
10 int main(){
11 ll n,l;
12 ll ans=0;
13 cin>>n;
14 for(int i=0;i<n;i++){
15 scanf("%lld",arr1+i);
16 cnt[arr1[i]]++;
17 }
18 for(int i=0;i<n;i++){
19 scanf("%lld",arr2+i);
20 if(cnt[arr1[i]]>=2){
21 vis[i]=1;
22 arr.push_back(arr1[i]);
23 ans=ans+arr2[i];
24 }
25 }
26 for(int i=0;i<n;i++){
27 if(vis[i]==0){
28 l=arr.size();
29 for(int j=0;j<l;j++){
30 if(arr1[i]<arr[j]&&((arr1[i]&arr[j])==arr1[i])){
31 arr.push_back(arr1[i]);
32 ans=ans+arr2[i];
33 break;
34 }
35 }
36 }
37 }
38 cout<<ans<<endl;
39
40
41 return 0;
42 }