bzoj2460: [BeiJing2011]元素 高斯消元+贪心

题意:给n个数对(x,y),选出任意多个,使任一子集的x抑或和不为0(x线性无关)

            并使y的和最大

题解:按y从大到小加入,维护线性基,能加就加

            线性基能表示出当前集合所有子集的抑或和,故正确性显然


#include<bits/stdc++.h>
using namespace std;
#define maxn 1020
#define rep(i,l,r) for(int i = l ; i <= r ; i++)

typedef long long ll;
struct node{
	ll num;
	int val;
	bool operator < (node a)const{
		return val > a.val;
	}
}dt[maxn];
int n,ans;
ll matrix[66];

int check(ll x){
	for (int i = 60 ; i >= 0 ; i--){
		if ( (x >> i) & 1 ){
			if ( !matrix[i] ){ matrix[i] = x; break; }
			x ^= matrix[i];
		}
	}
	if ( x ) return 1;
	return 0;
}
int main(){
	scanf("%d",&n);
	for (int i = 1 ; i <= n ; i++) scanf("%lld %d",&dt[i].num,&dt[i].val);
	sort(dt + 1,dt + n + 1);
	for (int i = 1 ; i <= n ; i++){
		if ( check(dt[i].num) ) ans += dt[i].val;
	}
	cout<<ans<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42484877/article/details/80963370