3105: [cqoi2013]新Nim游戏|贪心|高斯消元

来源:互联网 发布:cf总是网络异常 编辑:程序博客网 时间:2024/05/21 11:19

显然先手取完后需要保证剩余的火柴数不存在抑或和为0的子集,否则先手必败。
这样可以选择出让不存在抑或和为0的子集的集合尽量大,然后用总数减去最大的这个值,然后就是BZOJ2460http://blog.csdn.net/ws_yzy/article/details/50931193
这根本就是双倍经验吗

#include<iostream>#include<algorithm>#include<cstdlib>#include<cstdio>#include<cstring>#include<vector>#include<cmath>#include<queue>#include<map>#include<set>#define ll long long#define N 1005using namespace std;int sc(){    int i=0; char c=getchar();    while( c>'9' || c<'0' ) c=getchar();    while( c>='0' && c<='9' )i=i*10+c-'0',c=getchar();    return i;}int a[N],w[N],ins[33],n;ll ans;int main(){    n=sc();    for(int i=1;i<=n;i++)        a[i]=sc();    sort(a+1,a+n+1);    for(int i=1;i<=n;i++)        ans+=(w[i]=a[i]);    for(int i=n;i;i--)    {        for(int k=30;k>=0;k--)        {            if((a[i]>>k)&1)            {                if(!ins[k])                {                    ins[k]=a[i];                    break;                }                a[i]^=ins[k];            }        }        if(a[i])ans-=w[i];    }    cout<<ans;    return 0;}
0 0