题目很显然就是要求序号的线性基。我们希望线性基里的权值最大,就按权值从大到小插入就行了。
为什么是对的呢?插入线性基的一个矿石只会和另一些矿石在一个位置上冲突,而那些矿石也只能插入这一位,同时它们价值不如当前的矿石,所以这是最优的。
#include <cstdio>
#include <algorithm>
using namespace std;
#define R register
#define LL long long
const int MAXN=1e3+10;
const int MB=62;
int n;
struct Node { LL x; int y; } a[MAXN];
inline bool cmp(Node x,Node y) { return x.y>y.y; }
LL p[MB+1];
inline int ins(LL x) {
for(R int i=MB;i>=0;i--)
if(x&(1LL<<i)) {
if(!p[i]) { p[i]=x; return 1;}
else x^=p[i];
}
return 0;
}
int main() {
scanf("%d",&n);
for(R int i=1;i<=n;i++)
scanf("%lld%d",&a[i].x,&a[i].y);
sort(a+1,a+1+n,cmp);
int ans=0;
for(R int i=1;i<=n;i++)
if(ins(a[i].x)) ans+=a[i].y;
printf("%d
",ans);
return 0;
}