題目鏈結
(是紀中的題,不過我已經沒有紀中的號了,於是翻出了我的古早部落格
複習的時候又做了一遍,還是想了一會兒的,並且由衷地覺得這真是一道好題。
考慮\(sg\)函式遞推。
由於每次操作只能動最後一行和最後一列,那麼設\(sg(i,j)\)表示以\((i,j)\)結尾的矩陣的\(sg\)函式值。
轉移有:\(sg(i,j)=mex\\),不過轉移的時候需要滿足對應的這一行/列的和為偶數才能轉移(和為偶數才能操作,也就是說這一列的和為偶數,\((i,j-1)\)才是後繼狀態,同理行也是這樣)
初始的\(sg(0,0)=0\)(什麼都沒有了,不能操作了,對於先手來說是必敗態
然後我們發現其實定義\(mex\)這個東西有點雞肋,我們可以考慮改變\(sg\)的定義,設\(sg(i,j)\)表示以\((i,j)\)結尾的矩陣是對於當前操作者是必敗態(為\(0\)),還是必勝態(為\(1\))。
轉移的話,可轉移的後繼狀態中,只要有乙個必敗態(\(sg=0\)),那麼它就可以是必勝態(\(sg=1\))
邊界情況:
\(sg(1,1)=a[1][1]\%2\)
然後是單獨剩下的第一行和第一列,拿第一行舉例子吧,第一列同理。對於只剩下第一行的情況,可以一次刪掉右邊最後一列,也可以刪掉這一整行。如果刪列的話,那麼\(sg\)是從左邊轉移過來的,沒有影響。如果是刪掉一整行的話,只需要判斷到當前這個位置的和是不是偶數,是偶數就是必勝態,但如果我們把\(sg[i-1][j]\)設為\(0\)的話,就不需要特判,可以自動轉移。
#include#include#include#includeusing namespace std;
#define n 1005
#define ll long long
int rd()
while(c>='0'&&c<='9')
return f*x;
}int s1[n][n]/*行的字首和*/,s2[n][n]/*列的字首和*/,sg[n][n];
int main()
if(sg[n][n]) puts("w");
else puts("l");
} return 0;}/*
222 4
6 83
5 4 2
1 5 9
7 3 8
*/
紀中集訓2019 11 05
題目鏈結 有 n 個點,求 n 1 個完美匹配,且其中不出現相同的邊。n le 10 3 打暴力 手玩找到規律。把匹配放到方格圖上,給屬於同乙個完美匹配的方格染上同樣的顏色,發現兩個性質 最後一列第一行填 n 之後往下從小到大填完偶數,再從小到大填完奇數 forall i in 1,n 1 從 1,...
紀中集訓2019 3 21 橋
描述 有 m 條河,每條河的兩邊有居民點,所以共有 m 1 排居名點 如果要從一排居名點到另一排相鄰的居民點需要過河 現在有 n 個人,每個人的起點座標是 p s 終點 q t 你可以在每條河上修建一座橋,過河必須通過橋 相鄰居民點距離為 1 不考慮過河的時間 問 n 個人到終點的路徑之和最小是多少...
紀中集訓2019 3 25 染色問題
有乙個紙片,紙片上有 n 個格仔,初始時沒有顏色 某個遊戲的內容是進行 m 次染色,使得染完後 n 個格仔一定有顏色 每次可以選擇乙個區間 l,r l le r 去染 不能不染 顏色可以覆蓋 問最後染出的序列有多少種 n,m le 10 6 說正解 方程中存在兩類貢獻,一種是 f times j 1...