題目:
第一次用sg函式解決問題,有許多不熟練的地方;
試圖按自己的理解寫乙個dfs,結果錯了(連題都沒讀對,以為是像跳棋一樣跳),這樣的話用dfs從左往右推就不行了呢;
附上自己的錯誤嘗試:
#include#include囧下面是正解,也就是個sg函式的模板;#include
using
namespace
std;
int maxn=200005
;int t,n,p,ans,g[2100000
];int dfs(int
x) ret^=dfs(k);
}if((x&(1
<=0
)
ret^=dfs(k);}}
if(!ret)g[x]=1
;
else g[x]=2;//
printf("%d %d\n",x,g[x]-1);
return g[x]-1;}
intmain()
//if(ans)continue;
//if(dfs(p)==0)ans=1;
ans^=dfs(p);
}if(ans)printf("
yes\n");
else printf("
no\n");
}return0;
}
狀壓一下每一行,先預處理出來所有狀態的sg函式值(注意vis[裡面是sg函式值]),然後每次詢問異或一下就可以了,還挺簡明的。
**如下:
#include#include#include
using
namespace
std;
int t,n,m,ans,sg[1
<<20
];bool vis[25
];void init(int
x)
else w=i;
}int k=0;//
求mex
while(vis[k])k++;
sg[x]=k;
}int
main()
ans^=sg[p];
}if(ans)printf("
yes\n");
else printf("
no\n");
}return0;
}
P2575 高手過招
傳送門 直接搞好像搞不了 考慮轉換模型 顯然每一行棋子不會跑到其他行.所以可以把每一行的情況看成乙個子博弈 顯然整個答案就是每一行的sg值的異或和 不懂的回去學sg函式.考慮怎麼分析一行的狀況 可以發現空位的個數是不會變的 如果把每一段連續的棋子看成一塊 整塊的的值為塊中棋子的個數 那麼每次操作會使...
洛谷 P1294 高手去散步
高手最近談戀愛了。不過是單相思。即使是單相思,也是完整的愛情 高手從未放棄對它的追求。今天,這個陽光明媚的早晨,太陽從西邊緩緩公升起。於是它找到高手,希望在晨讀開始之前和高手一起在鰲頭山上一起散步。高手當然不會放棄這次夢寐以求的機會,他已經準備好了一切。輸入格式 第一行,兩個用空格隔開的整數n m....
P1294 高手去散步 洛谷
高手最近談戀愛了。不過是單相思。即使是單相思,也是完整的愛情 高手從未放棄對它的追求。今天,這個陽光明媚的早晨,太陽從西邊緩緩公升起。於是它找到高手,希望在晨讀開始之前和高手一起在鰲頭山上一起散步。高手當然不會放棄這次夢寐以求的機會,他已經準備好了一切。輸入格式 第一行,兩個用空格隔開的整數n m....