链接
https://www.luogu.org/problemnew/show/P4570
题解
我一开始想的是一个一个往里加,如果发现当前要加入的这个和已有的线性相关,那就删掉和它线性相关的那几个中权值最小的(前提是会使答案变大)
但是转念一想,我按照权值从大到小排序,然后一个一个往里加不就行了
代码
#include <bits/stdc++.h>
#define maxn 100010
#define cl(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long ll;
struct LinearBasis
{
ll b[70], ans;
void clear(){cl(b);}
void insert(ll t)
{
for(ll k(62);~k;k--)
if(t&(1ll<<k))
{
if(!b[k])b[k]=t;
t^=b[k];
}
}
void insert(ll *a, ll len)
{
for(auto i(1);i<=len;i++)insert(a[i]);
}
bool check(ll x)
{
for(ll k(62);~k;k--)
if(x&(1ll<<k))x^=b[k];
return !x;
}
}LB;
pair<ll,ll> p[maxn];
int main()
{
ll i, n, ans(0);
cin>>n;
for(i=1;i<=n;i++)
cin>>p[i].first>>p[i].second;
sort(p+1,p+n+1,[](pair<ll,ll> a, pair<ll,ll> b)->bool{return a.second>b.second;});
for(i=1;i<=n;i++)
{
if(!LB.check(p[i].first))
{
ans+=p[i].second;
LB.insert(p[i].first);
}
}
cout<<ans;
return 0;
}