Description
有 (n) 个元素,每个元素有个序号和一个值,一个元素可以选择当且尽当其序号与已选元素序号的异或和不为 (0),求你可选择的元素值和的最大值。
Solution
容易发现,要求的就是值和最大的(序号)线性无关组
考虑贪心,将值大的放在前面,然后能放入线性基就放入线性基即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 10005;
struct linearbase {
int a[64];
bool insert(int k) {
for(int j=63; j>=0; --j)
if((k>>j)&1ll)
if(a[j]==0) {a[j]=k;return true;}
else k^=a[j];
return false;
}
} l;
int n;
struct ks {
int x,y;
bool operator < (const ks &b) {
return y>b.y;
}
} a[N];
signed main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) {
int x,y;
cin>>x>>y;
a[i]={x,y};
}
int ans=0;
sort(a+1,a+n+1);
for(int i=1;i<=n;i++) {
if(l.insert(a[i].x)) ans+=a[i].y;
}
cout<<ans;
}