线性基
简单的线性基应用。
把所有矿石按照法力大小sort一下,然后根据元素序号搞线性基就好了。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1005
using namespace std;
typedef long long LL;
struct nd{ LL x,id; }a[N];
int n,ans;
LL p[65];
bool cmp(nd a,nd b){ return a.x>b.x; }
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%lld%lld",&a[i].id,&a[i].x);
sort(a+1,a+n+1,cmp);
for (int i=1;i<=n;i++){
for (int j=64;~j;j--)
if ((a[i].id>>j)&1)
if (!p[j]) { p[j]=a[i].id; break; }
else a[i].id^=p[j];
if (a[i].id) ans+=a[i].x;
}
return printf("%d\n",ans),0;
}