CodeForces - 1230D(思维+位运算)
题意
https://vjudge.net/problem/CodeForces-1230D
要组建一个小组,要求小组中每个人都不比所有人强,当一个人懂得一个算法但是另一个不懂那么前者认为他比后者强。所以这个小组要满足一个人懂得算法必定有另一个人全懂。每个人的技能是不同的,要求出这个小组能组成的技能最大值。
思路
先遍历一遍,用map记录a[i](会的算法)的个数,出现次数大于等于2的a[i],是肯定可以放到小组里的,因为有人和他的懂的相同。
然后对出现次数小于2的人,和刚才确定的人的对比,如果他的能力大于确定的人,那么肯定不行,因为他会的有的东西其他人都不会;如果他的能力小于确定的人,而且(x&y)==x,x是他,y是确定的人,这个式子就表示了x会的算法确定的人里也会,所以可以加入到小组里。
代码
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define ll long long const int N=200005; const int mod=1e9+7; const double eps=1e-8; const double PI = acos(-1.0); #define lowbit(x) (x&(-x)) int n; ll a[N],b[N]; vector<ll> ans; map<ll,ll> mp; int main() { std::ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; mp[a[i]]++; } ll res=0; for(int i=1;i<=n;i++) { cin>>b[i]; if(mp[a[i]]>=2) ans.push_back(i),res+=b[i]; } for(int i=1;i<=n;i++) { if(mp[a[i]]<2) { for(int j:ans) { if(a[i]<a[j]&&((a[i]&a[j])==a[i])) { res+=b[i]; ans.push_back(i); break; } } } } cout<<res<<endl; return 0; }