bzoj3105 [CQOI2013]新Nim游戏
发现最优解一定是拿一部分,使得剩下的没有任何一个子集异或和为0,拿的只剩一个肯定可以,所以一定有解,线性基乱搞。
那么考虑如何满足拿的最少,线性基按权值排序就好了。感性理解十分清晰
理性分析的话,可以证明这是一个拟阵$M={S,I}$ 当$S$的某个子集$A$满足$A$的任何子集异或和都不为0时,$A∈I$。
1.遗传性:$A∈I$,那么对于任何$B∈A$,$B∈I$
2.交换性:$A∈I$,$B∈I$,$|A|<|B|$,若任意$x∈B-A$,均满足$A∪x∉I$,则$A$能异或出的数一定比$B$多,与$|A|<|B|$矛盾,证必。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 #define N 105 7 #define LL long long 8 using namespace std; 9 int n,p[32]; 10 LL a[N],sum; 11 int main(){ 12 scanf("%d",&n); 13 for(int i=1;i<=n;i++){ 14 scanf("%lld",&a[i]); 15 sum+=a[i]; 16 } 17 sort(a+1,a+n+1,greater<int>()); 18 for(int i=1;i<=n;i++){ 19 int now=a[i]; 20 for(int j=31;~j;j--){ 21 if(a[i]&(1<<j)){ 22 if(p[j])a[i]^=a[p[j]]; 23 else{p[j]=i;sum-=now;break;} 24 } 25 } 26 } 27 printf("%lld\n",sum); 28 return 0; 29 }
人生如梦亦如幻 朝如晨露暮如霞。