题面
很裸的一道题,可以作为线性基的入门姿势
将费用从大到小排序,并用线性基维护序号即可
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; }