BZOJ 3105 线性基 高斯消元

来源:互联网 发布:算法心得这书怎么样 编辑:程序博客网 时间:2024/05/22 06:36

思路:
按照从大到小排个序
维护两个数组 一个是消元后的 另一个是 按照消元的位置排的
不断 维护从大到小
(呃具体见代码)

//By SiriusRen#include <cstdio>#include <iostream>#include <algorithm>using namespace std;#define int long long#define N 105int n,a[N],b[N],flag=1,ans;signed main(){    scanf("%lld",&n);    for(int i=1;i<=n;i++)scanf("%lld",&a[i]),ans+=a[i],b[i]=a[i];    sort(a+1,a+1+n,greater<int>()),sort(b+1,b+1+n,greater<int>());    for(int i=1<<30,j;i;i>>=1){        for(j=flag;j<=n;j++)if(a[j]&i)break;        if(j==n+1)continue;        for(int k=j-1;k>=flag;k--)swap(a[k+1],a[k]),swap(b[k+1],b[k]);        for(int k=1;k<=n;k++)if(k!=flag&&(a[k]&i))a[k]^=a[flag];        ans-=b[flag];        flag++;    }    printf("%lld\n",ans?ans:-1);}

这里写图片描述

0 0