bzoj2460: [BeiJing2011]元素(线性基+贪心)

[BeiJing2011]元素

题目传送门

解题思路

把矿石按照魔法值从大到小排序,然后按照顺序构造线性基,如果可以构造就把答案加上去,不能就不加,最后得出的就是真确答案。因为是从大到小构造的,所以不可能把已经构造好的减掉,损失一定更大。

代码如下

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

const int N = 100005;

struct T{
    ll v, w;
    T(){}
    T(int v, int w): v(v), w(w){}
    bool operator<(const T& a)const{
        return w > a.w;
    }
}a[N];
ll b[N];

int main()
{
    int n;
    cin >> n;
    for(int i = 1; i <= n; i ++)
        scanf("%lld%lld", &a[i].v, &a[i].w);
    sort(a + 1, a + n + 1);
    ll ans = 0;
    for(int i = 1; i <= n; i ++){
        for(int j = 63; j >= 0; j --){
            if((a[i].v >> j) & 1){
                if(b[j])
                    a[i].v ^= b[j];
                else {
                    b[j] = a[i].v;
                    ans += a[i].w;
                    break;
                }
            }
        }
    }
    cout << ans << endl;
    return 0;
}
posted @ 2019-07-26 21:11  whisperlzw  阅读(119)  评论(0编辑  收藏  举报