自己對sg函式的小理解

2021-07-25 02:35:06 字數 915 閱讀 8326

首先定義mex(minimal excludant)運算,這是施加於乙個集合的運算,表示最小的不屬於這個集合的非負整數。例如mex=3、mex=0、mex{}=0。

對於乙個給定的有向無環圖,定義關於圖的每個頂點的sprague-garundy函式g如下:g(x)=mex。

sg函式的一些性質

(1)當sg=0時,則其後繼都!=0;

(2)當sg!=0時,則其後繼中存在乙個為0;

所以當乙個點為p型點當且僅當它的sg函式的值為0

在單個遊戲中只需算一下sg是否為即可

在多個遊戲組合的複雜的遊戲中,如果遊戲可以分解(各個遊戲互相不影響),需要計算出各個遊戲的sg函式值然後將所有值異或一下,即是複雜遊戲的結果

所以在看到一道題目是首先需要解決肯定是如何計算出sg函式的問題

(1)打表

(2)dfs,(當資料範圍太大,無法開出陣列的時候)

無論那種情況,在預處理的過程中都需要有一種意識就是,當你想算乙個點的sg函式值時,必須要準確的判斷出該點所有的後繼情況

打表的模板:

//f:可以取走的石子個數

//sg:0~n的sg函式值

//hash:mex{}

int f[k],sg[n],hash[n];

void getsg(int n)

中未出現的最小的非負整數}}

} dfs的模板:

//注意 s陣列要按從小到大排序 sg函式要初始化為-1 對於每個集合只需初始化1遍

//n是集合s的大小 s[i]是定義的特殊取法規則的陣列

int s[n],sg[n],n;

int getsg(int x)

for(i=0;; i++)

if(!vis[i])

return sg[x];

}

我對SG函式的理解

i 的sg函式g i 定義如下 如果該點沒有出邊,g i 0 否則定義乙個mex minimal excludant 操作,這是對乙個集合進行的操作,返回值為集合中所不包含的最小的非負整數,那麼g i m ex。顯然對於乙個有向無環圖,我們都能在o 狀態總數 每個點 的後繼狀 態數 時間內求出所有點...

關於sg函式打表的理解

博弈的題大多數用sg函式打表找規律 博弈的題大多數用sg函式打表找規律 博弈的題大多數用sg函式打表找規律 記憶話搜尋可以更快 記憶話搜尋可以更快 記憶話搜尋可以更快 定義sg值為0時表示後手必勝,sg為1時為先手必勝。那麼對於每乙個人,都會去查詢使得當前狀態變成sg值為0的情況 那麼就是說,對於多...

自己對boot c 的 理解

bootloader 的 目標是啟動核心 0.設定串列埠1.關閉看門狗2.設定時鐘3.初始化sdram4.重定位5.執行main 現在要完成對main的編寫 void main void define tag next t struct tag u32 t t hdr.size void setup...