题目大意:
你有n个二元组(x,y),要求从中任取几个,使得x的值亦或起来不为0,且y之和最大。
题解:
显然是以x来构造线性基的,然而加入元素的个数是有限制的,那当然就是大的先来喽,排个序就OK啦!
代码:
#include <bits/stdc++.h> #define ll long long using namespace std; ll n,ans,b[65]; struct point{ ll x,y; } a[10005]; bool cmp(point a,point b){ return a.y>b.y; } void insert(ll x,ll y){ for (int i=63;i>=0;i--) if (x>>i) if (b[i]) x^=b[i]; else {b[i]=x,ans+=y; break;} } int main(){ scanf("%lld",&n); for (int i=1;i<=n;i++) scanf("%lld%lld",&a[i].x,&a[i].y); sort(a+1,a+1+n,cmp); for (int i=1;i<=n;i++) insert(a[i].x,a[i].y); printf("%lld ",ans); return 0; }