洛谷P2575高手過招 SG函式初試

2022-05-12 12:32:31 字數 1244 閱讀 5893

題目:

第一次用sg函式解決問題,有許多不熟練的地方;

試圖按自己的理解寫乙個dfs,結果錯了(連題都沒讀對,以為是像跳棋一樣跳),這樣的話用dfs從左往右推就不行了呢;

附上自己的錯誤嘗試:

#include#include

#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函式的模板;

狀壓一下每一行,先預處理出來所有狀態的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....