hdu 1536 博弈SG函式

2022-08-30 09:09:09 字數 2077 閱讀 6932

1 #include 2 #include 3 #include 4 #include 5 #include 

6 #include 7 #include 8 #include 9

10using

namespace

std;

1112

const

int max = 109;13

int num[max],sg[max*100

],v[max];

14int

n,m;

1516

void

get_sg() 23}

24int

j;25

for(j = 0;v[j] == i; ++j);

26 sg[i] =j;27}

28}2930

intmain()

37get_sg();

38 scanf("

%d",&m);

39while(m--)

48if(ans == 0

)49 printf("l"

);50

else

51 printf("w"

);52

}53 printf("\n"

);54}55

return0;

56 }

view code

sg解釋,忘記**找來的了~

給定乙個有向無環圖和乙個起始頂點上的一枚棋子,兩名選手交替的將這枚棋子沿有向邊進行移動,無法移動者判負。事實上,這個遊戲可以認為是所有impartial combinatorial games的抽象模型。也就是說,任何乙個icg都可以通過把每個局面看成乙個頂點,對每個局面和它的子局面連一條有向邊來抽象成這個「有向圖遊戲」。下面我們就在有向無環圖的頂點上定義sprague-garundy函式。

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

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

來看一下sg函式的性質。首先,所有的terminal position所對應的頂點,也就是沒有出邊的頂點,其sg值為0,因為它的後繼集合是空集。然後對於乙個g(x)=0的頂點x,它的所有後繼y都滿足g(y)!=0。對於乙個g(x)!=0的頂點,必定存在乙個後繼y滿足g(y)=0。

以上這三句話表明,頂點x所代表的postion是p-position當且僅當g(x)=0(跟p-positioin/n-position的定義的那三句話是完全對應的)。我們通過計算有向無環圖的每個頂點的sg值,就可以對每種局面找到必勝策略了。但sg函式的用途遠沒有這樣簡單。如果將有向圖遊戲變複雜一點,比如說,有向圖上並不是只有一枚棋子,而是有n枚棋子,每次可以任選一顆進行移動,這時,怎樣找到必勝策略呢?

讓我們再來考慮一下頂點的sg值的意義。當g(x)=k時,表明對於任意乙個0<=i對於n個棋子,設它們對應的頂點的sg值分別為(a1,a2,...,an),再設局面(a1,a2,...,an)時的nim遊戲的一種必勝策略是把ai變成k,那麼原遊戲的一種必勝策略就是把第i枚棋子移動到乙個sg值為k的頂點。這聽上去有點過於神奇——怎麼繞了一圈又回到nim遊戲上了。

其實我們還是只要證明這種多棋子的有向圖遊戲的局面是p-position當且僅當所有棋子所在的位置的sg函式的異或為0。這個證明與上節的bouton's theorem幾乎是完全相同的,只需要適當的改幾個名詞就行了。

剛才,我為了使問題看上去更容易一些,認為n枚棋子是在乙個有向圖上移動。但如果不是在乙個有向圖上,而是每個棋子在乙個有向圖上,每次可以任選乙個棋子(也就是任選乙個有向圖)進行移動,這樣也不會給結論帶來任何變化。

所以我們可以定義有向圖遊戲的和(sum of graph games):設g1、g2、……、gn是n個有向圖遊戲,定義遊戲g是g1、g2、……、gn的和(sum),遊戲g的移動規則是:任選乙個子遊戲gi並移動上面的棋子。sprague-grundy theorem就是:g(g)=g(g1)^g(g2)^...^g(gn)。

S Nim HDU 1536 博弈 sg函式

首先輸入k,表示乙個集合的大小,之後輸入集合,表示對於這對石子只能去這個集合中的元素的個數,之後輸入 乙個m表示接下來對於這個集合要進行m次詢問,之後m行,每行輸入乙個n表示有n個堆,每堆有n1個石子,問這一行所表示的狀態是贏還是輸,如果贏輸入w否則l。如果沒有每次取石子個數的限制的話,那麼僅僅需要...

HDU 1536 SG函式應用

只要構造好sg函式 就行 ac includeusing namespace std include int a 110 k k為全域性變數 int sg 10010 flag 110 void sg sg函式 int main if s cout w else cout l cout return...

hdu 1536 SG函式的應用

hdu 1536 submit time judge status pro.id exe.time exe.memory code len.language 2013 07 24 10 17 33 accepted 1536 109ms 476k 1174 b c include includeus...