Codeforces Round #588 (Div. 2) D题【补题ING】

 思路:先找出现次数>=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<<'\n';
38     return 0;
39 }
40 
41 /*
42 
43 11
44 11
45 10
46 
47 
48 010
49 101
50 */

猜你喜欢

转载自www.cnblogs.com/pengge666/p/11827416.html