先看這篇題解
這篇題解最開始的貪心我在賽時的時候想到了的,所以說博弈論完全是可以用貪心的,不要怕
但是這裡貪心還有一個問題,在對手攻擊力比這張牌防禦力大的區間中,對手可能有多張牌的防禦力最大,這個時候難道每一個點都要連邊嗎?其實不用,連線其中隨便一個就好了,因為我們發現,在每一回合開始時,無論是誰出牌,都不用關注出的這個牌的攻擊力是多少,只要防禦力是相等的,攻擊力多少並不會影響接下來的遊戲的走向(這點非常重要,不然時間複雜度就不對了;其實我們貪心用的也是這個思想,就是每個人出牌的時候,只要攻擊力比對方上次出的牌的防禦力大,我們就應該出防禦力最大的,因為攻擊力根本不會影響遊戲的走向)
題解說的邊的方向,是從自己連向對手;但是我們一般連邊都是從對手連向自己(因為我們要從對手的狀態推到自己的狀態),然而如果按照這種連邊就不太好想,而像題解這麼連邊,就可以利用每個點只有一個出邊進行dfs,很方便地討論每一個點的狀態
比如從某個點開始走,走的方向肯定是確定的,如果最終走下來的路徑是一條鏈,那麼這個點(以及這條鏈上的每一個點)的勝負狀態肯定是唯一確定的;如果最終是一個環,那麼這些點肯定都是平局(所以我們可以不用題解說的,總牌數減必勝減必敗等於平局這種方法,而是直接在圖上進行統計;然而題解的這種思想也要記住)。但是其實判環的程式碼有點麻煩,如果用vis判斷,vis每次肯定不能清空,然後可能出現這種情況
紅色線段的點在上一次dfs中已經找過了,但是vis肯定為\(1\)了,而第二次dfs的時候肯定不能直接判斷這些都是平局的點
然後這一道題目最後一個注意的點就是,題目要求Monocarp先手,看起來我們似乎只用建立Monocarp的\(n\)個點就好了;然而如果這樣做,行倒是行,但是沒有上面說的兩邊都建邊簡單,所以以後不要被題目所求的量迷惑了