bzoj 3105: [cqoi2013]新Nim遊戲【線性基】
阿新 • • 發佈:2018-09-06
() 子集 return urn clu turn else 遊戲 所有
nim遊戲的先手必勝條件是所有堆的火柴個數異或和為0,也就是找一個剩下火柴堆數沒有異或和為0的子集的方案,且這個方案保證剩下的火柴個數總和最大
然後我就不會了,其實我到現在也不知道擬陣是個什麽玩意……
詳見:https://blog.csdn.net/wyfcyx_forever/article/details/39477673
總之用線性基維護即可
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=105; int n,top,a[N],b[N],q[N]; long long sm,ans; bool cmp(const int &a,const int &b) { return a>b; } int main() { scanf("%d\n",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]),sm+=a[i]; sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) { int t=a[i]; for(int j=30;j>=0;j--) if(a[i]&(1<<j)) { if(!b[j]) { b[j]=i; break; } else a[i]^=a[b[j]]; } if(a[i]) ans+=t; } if(ans) printf("%lld\n",sm-ans); else puts("-1"); return 0; }
bzoj 3105: [cqoi2013]新Nim遊戲【線性基】