P4570 [BJWC2011]元素
题意:给定一些矿石编号和矿石价值,问在保证矿石编号异或和不为0的情况下,最大价值是多少。
思路:贪心+线性基。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
ll id,val;
}a[1005];
ll b[105];
int cmp(node x,node y){
return x.val>y.val;
}
int ins(ll x){
for(int i=61;i>=0;i--){
if(x&(1ll<<i)){
if(!b[i]){
b[i]=x;
return 1;
}
x^=b[i];
}
}
return 0;
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lld%lld",&a[i].id,&a[i].val);
}
sort(a,a+n,cmp);
ll ans=0;
for(int i=0;i<n;i++){
if(ins(a[i].id))
ans+=a[i].val;
}
printf("%lld\n",ans);
}