题目大意:给定一些元素,每个元素有两个值a和b,现在需要选出一些元素,在不存在a值异或和为0的子集的情况下使b之和最大
可以用拟阵证明贪心的正确性(我不会证,同学会)
于是我们将b值排序,从大到小插入
动态维护线性基即可
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 1010 using namespace std; struct abcd{ long long a; int b; friend istream& operator >> (istream& _,abcd &x) { _>>x.a>>x.b; return _; } bool operator < (const abcd &x) const { return b > x.b ; } }a[M]; int n; long long ans,linear_bases[70]; int main() { int i,j; cin>>n; for(i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1); for(i=1;i<=n;i++) { for(j=62;~j;j--) if(a[i].a&(1ll<<j) ) { if(!linear_bases[j]) { linear_bases[j]=a[i].a; break; } a[i].a^=linear_bases[j]; } if(a[i].a) ans+=a[i].b; } cout<<ans<<endl; }
BZOJ 2460 BeiJing2011 元素 贪心+高斯消元
原文地址:http://blog.csdn.net/popoqqq/article/details/42558187