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;
}
相關文章
相關標籤/搜索