[BZOJ1188/Luogu3185][HNOI2007]分裂游戏
生活随笔
收集整理的這篇文章主要介紹了
[BZOJ1188/Luogu3185][HNOI2007]分裂游戏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:
BZOJ1188
Luogu3185
博弈論。
首先,每一堆石子都是互相獨立,不影響的,那么就只需求解每一堆的\(SG\)函數\(Xor\)即可。
再想,對于每一堆石子,里面的每一個石頭都是互相獨立的,那么就只需求解一個石子的\(SG\)函數,再用\(p_i\)個\(Xor\)起來就得到了答案。
那么如果是奇數不變,偶數個則為\(0\)。
對于一個石子的\(SG\)函數暴力求即可。
妙啊喵啊
時間復雜度 \(O(Tn^3)\)
#include <cstdio> #include <cstring>int t,n,p[25],SG[25]; bool Bus[505];int main() {for(scanf("%d",&t);t--;){scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%d",&p[i]);//這里用1~n編號for(int i=n;i>=1;--i){memset(Bus,0,sizeof Bus);for(int j=i+1;j<=n;++j)for(int k=j;k<=n;++k)Bus[SG[j]^SG[k]]=true;//后繼狀態mexfor(int j=0;j<=500;++j)if(!Bus[j])SG[i]=j,j=500;}int TSG=0,p1=0,p2=0,p3=0,Cnt=0;for(int i=1;i<=n;++i)if(p[i]&1)TSG^=SG[i];//是奇數,只需xor一次if(TSG)for(int i=1;i<n;++i)for(int j=i+1;j<=n;++j)for(int k=j;k<=n;++k)if(!(TSG^SG[i]^SG[j]^SG[k]))//能使Xor和變為0(必敗){++Cnt;if(!p1)p1=i,p2=j,p3=k;}printf("%d %d %d\n%d\n",p1-1,p2-1,p3-1,Cnt);}return 0; }轉載于:https://www.cnblogs.com/LanrTabe/p/10202994.html
總結
以上是生活随笔為你收集整理的[BZOJ1188/Luogu3185][HNOI2007]分裂游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis常用命令(一)
- 下一篇: 小甲鱼-013元组tuple:上了枷锁的