CodeForces - 1230D(思惟+位运算)

题意

https://vjudge.net/problem/CodeForces-1230Dios

要组建一个小组,要求小组中每一个人都不比全部人强,当一我的懂得一个算法可是另外一个不懂那么前者认为他比后者强。因此这个小组要知足一我的懂得算法一定有另外一我的全懂。每一个人的技能是不一样的,要求出这个小组能组成的技能最大值。c++

思路

先遍历一遍,用map记录a[i](会的算法)的个数,出现次数大于等于2的a[i],是确定能够放到小组里的,由于有人和他的懂的相同。算法

而后对出现次数小于2的人,和刚才肯定的人的对比,若是他的能力大于肯定的人,那么确定不行,由于他会的有的东西其余人都不会;若是他的能力小于肯定的人,并且(x&y)==x,x是他,y是肯定的人,这个式子就表示了x会的算法肯定的人里也会,因此能够加入到小组里。spa

代码

#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;
}
相关文章
相关标签/搜索