题意:http://www.lydsy.com/JudgeOnline/problem.php?id=3105

sol  :要想必胜则拿完后异或空间不能包含0,即给对手留下一组线性基

   为保证拿走的最小,即留下一组简化前的极大线性基,需从大到小排序,跑线性基即可

   最终答案为自由元的和

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#define int long long
using namespace std;
int n,top,sum,ans,a[105],b[35],q[105],Pow[35];
bool cmp(int a,int b) { return a>b; }
void gauss()
{
    for(int i=1;i<=n;i++) sum+=a[i];
    for(int i=1;i<=n;i++)
    {
        int tmp=a[i];
        for(int j=30;j>=0;j--)
            if(a[i]&Pow[j])
            {
                if(!b[j]) { b[j]=i; break; }
                else a[i]^=a[b[j]];
            }
        if(a[i]) ans+=tmp;
    }
}
signed main()
{
    Pow[0]=1; for(int i=1;i<=30;i++) Pow[i]=Pow[i-1]<<1;
    scanf("%lld",&n); for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    sort(a+1,a+n+1,cmp); gauss();
    if(ans) printf("%lld\n",sum-ans);
    else puts("-1"); 
    return 0;
}

 

相关文章:

  • 2021-07-23
  • 2021-12-13
  • 2021-07-03
  • 2022-03-04
  • 2021-12-23
  • 2022-02-02
猜你喜欢
  • 2022-01-26
  • 2021-10-07
  • 2021-07-21
  • 2021-08-17
  • 2021-09-23
  • 2021-10-29
相关资源
相似解决方案