很裸的一道题,可以作为线性基的入门姿势
将费用从大到小排序,并用线性基维护序号即可
hale解锁新姿势——线性基
#include<bits/stdc++.h> #define ll long long const int N=1e5+7; using namespace std; ll m,n,k,ans; struct node { ll val,cost; bool operator<(const node &x) const { return cost>x.cost; } } p[N]; struct xxj { ll d[60]; bool insert(ll x) { for (ll i=60;i>=0;i--) { if (x&(1ll<<i)) { if (!d[i]) { d[i]=x; return true; } else x^=d[i]; } } return false; } } G; int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%lld%lld",&p[i].val,&p[i].cost); sort(p+1,p+n+1); for (int i=1;i<=n;i++) { if (G.insert(p[i].val)) ans+=p[i].cost; } printf("%lld\n",ans); return 0; }