思路:先找出现次数>=2数。然后在取跑所有数,需要考虑一般情况(当一个人比另一个人的ai小且他们的与运算等于小的那个人的ai那么可以知道大的那个人必定强于ai小的那个人)。
则可以用位运算实现判断强弱。
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 #define N 100500 6 struct str{ 7 int a,b; 8 }st[N]; 9 map<int,int> mp; 10 vector<int> v; 11 signed main(){ 12 int n; 13 cin>>n; 14 for(int i=1;i<=n;i++) { 15 cin>>st[i].a;mp[st[i].a]++; 16 } 17 for(int i=1;i<=n;i++) cin>>st[i].b; 18 int ans=0; 19 for(int i=1;i<=n;i++){ 20 21 if(mp[st[i].a]>=2){ 22 ans+=st[i].b; 23 v.push_back(st[i].a); 24 } 25 } 26 for(int i=1;i<=n;i++){ 27 if(mp[st[i].a]>=2) 28 continue; 29 for(int j=0;j<v.size();j++){ 30 if(v[j]>st[i].a&&(v[j]&st[i].a)==st[i].a){ 31 v.push_back(st[i].a); 32 ans+=st[i].b; 33 break; 34 } 35 } 36 } 37 cout<<ans<<' '; 38 return 0; 39 } 40 41 /* 42 43 11 44 11 45 10 46 47 48 010 49 101 50 */