怕不是学了个假的线性基。。。一直以为要高位到低位插入,结果那个是高斯消元的线性基。。。
那么直接排序权值就行了。
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<map> using namespace std; typedef long long LL;struct node{LL num;int d;}a[1100]; bool cmp(node n1,node n2){return n1.d>n2.d;} LL lt[110];int ans; void insert(LL k) {for(int i=62;i>=0;i--)if(a[k].num&(1LL<<i)){if(lt[i]==0){lt[i]=a[k].num;ans+=a[k].d;return ;}else a[k].num^=lt[i];} }int main() {int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%lld%d",&a[i].num,&a[i].d);sort(a+1,a+n+1,cmp);ans=0;for(int i=1;i<=n;i++)insert(i);printf("%d\n",ans);return 0; }