码迷,mamicode.com
首页 > 其他好文 > 详细

[BJWC2011] 元素 - 线性基,贪心

时间:2020-06-17 12:41:55      阅读:51      评论:0      收藏:0      [点我收藏+]

标签:signed   name   ios   efi   operator   turn   amp   线性   script   

Description

\(n\) 个元素,每个元素有个序号和一个值,一个元素可以选择当且尽当其序号与已选元素序号的异或和不为 \(0\),求你可选择的元素值和的最大值。

Solution

容易发现,要求的就是值和最大的(序号)线性无关组

考虑贪心,将值大的放在前面,然后能放入线性基就放入线性基即可

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 10005;

struct linearbase {
    int a[64];
    bool insert(int k) {
        for(int j=63; j>=0; --j)
            if((k>>j)&1ll)
                if(a[j]==0) {a[j]=k;return true;}
                else k^=a[j];
        return false;
    }
} l;

int n;

struct ks {
    int x,y;
    bool operator < (const ks &b) {
        return y>b.y;
    }
} a[N];

signed main() {
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++) {
        int x,y;
        cin>>x>>y;
        a[i]={x,y};
    }
    int ans=0;
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++) {
        if(l.insert(a[i].x)) ans+=a[i].y;
    }
    cout<<ans;
}

[BJWC2011] 元素 - 线性基,贪心

标签:signed   name   ios   efi   operator   turn   amp   线性   script   

原文地址:https://www.cnblogs.com/mollnn/p/13151723.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!