[bzoj2460] [BeiJing2011]元素(线性基+贪心)
题目大意: 有一些矿石,每个矿石有一个a和一个b值,要求选出一些矿石,b的和最大且不存在某个矿石子集它们的a的异或和为0.
解题关键:对魔力进行由大到小排序,依次加入线性基,统计即可。
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace std; typedef long long ll; const int MAX_BASE=63; ll base[64],n,m; struct node{ ll x,y; bool operator<(const node &a)const{ return y>a.y; } }a[10006]; ll ans=0; //构造线性基,也可用来判断x是否存在,最后返回是否等于0即可。 void getbase(){ memset(base,0,sizeof base); for(int i=1;i<=n;i++){ for(int j=MAX_BASE;j>=0;j--){ if(a[i].x>>j){ if(!base[j]){ base[j]=a[i].x; ans+=a[i].y; break; } a[i].x^=base[j]; } } } } int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i].x>>a[i].y; sort(a+1,a+n+1); getbase(); printf("%lld\n",ans); return 0; }