题目描述
给出n个元素,每一个元素有一个数值\(a_i\)和价值\(b_i\)
定义子集\(S\)的价值为\(\sum b[i]\),求\(a\)的异或值不为0的子集中,价值的最大值
分析
一篇有理有据的题解
嗯就是线性基+贪心
#include<bits/stdc++.h>
#define rep(X,A,B) for(int X=A;X<=B;X++)
#define tep(X,A,B) for(int X=A;X>=B;X--)
#define LL long long
#define DB double
const int N=10010;
using namespace std;
int n,ans=0;
LL vis[N];
struct nn{
LL num;
int val;
}a[N];
int cmp(nn A,nn B){
return A.val>B.val;
}
int ADD(LL x){
int pos=0;
LL now=x;
while(x)pos++,x/=2;
tep(i,pos,1){
if(!now)return 0;
if(!(now>>(i-1)))continue;
if(!vis[i]){
vis[i]=now;
return 1;
}
now^=vis[i];
}
return 0;
}
int main(){
scanf("%d",&n);
rep(i,1,n)scanf("%lld%d",&a[i].num,&a[i].val);
sort(a+1,a+n+1,cmp);
rep(i,1,n)if(ADD(a[i].num))ans+=a[i].val;
printf("%d\n",ans);
return 0;
}