线性基题目(元素)
链接:https://www.luogu.com.cn/problem/P4570
线性基最重要的性质
1、原序列任意数字,都可由线性基异或得到。
2、线性基不可能异或得到0
3、无论怎么用原序列对线性基进行插入,得到的线性基是一定的。
题目分析:由于线性基不可能为0,而线性基已经满足不会异或到0且最大的条件(不然可以继续往线性基里插入元素)
那么这时即可贪心,按权值排序,如果能插入则更新答案
#include <bits/stdc++.h> using namespace std; typedef long long ll; int n; const int N = 1e5 + 10; struct node{ ll a,b; bool operator <(const node &w)const{ return b > w.b; } }tr[N]; int p[64]; bool insert(ll x){ for(int i=63;i>=0;i--){ if(!(x >> i)) continue; if(!p[i]){ p[i] = x; return 1; } x ^= p[i]; } return 0; } int main(){ cin >> n; for(int i=1;i<=n;i++){ cin >> tr[i].a >> tr[i].b; } sort(tr+1,tr+1+n); ll ans = 0; for(int i=1;i<=n;i++){ if(insert(tr[i].a)) ans += tr[i].b; } cout << ans << endl; return 0; }