CCPC2019 秦皇島站部分題解

雖然已經過去了很久,而且我也沒寫補題的代碼(咕咕咕&寫了不知道交到哪裏),但是感覺這場比賽的題目質量還是不錯的,還是寫一下題解

C:
大致題意:
定義一個序列a1,a2,...ana_1,a_2,...a_n的價值value(a)i=1nai1000nivalue(a)\sum_{i=1}^n a_i*1000^{n-i}
給一個長nn的序列AA,長mm的序列BB,在AA中挑一個子序列AA'BB中挑一個子序列BB',求有多少個本質不同的方案滿足value(A)>value(B)value(A')>value(B'),其中兩個子序列不同當且僅當價值不同
n<=5000,1<=Ai,Bi<=100n<=5000, 1<=A_i,B_i<=100

先考慮怎麼選子序列使得不選重。假設A1,A2...AnA'_1,A'_2...A'_n的值已經定了,那麼從AA序列的開頭開始,每次找當前位置後面AiA'_i第一次出現的位置作爲選擇的位置,這樣可以保證選出來的序列不重複。
將上述選法轉化爲dp方法,比如說我們現在在AA裏面dp,設f[i]f[i]表示以ii爲結尾的子序列有多少個,那麼設從1到iiA[i]A[i]上一次出現的位置是last[i]last[i],可以得到dp轉移式f[i]=j=last[i]if[j]f[i]=\sum_{j=last[i]}^{i}f[j]

考慮AA'BB'的價值比較,因爲序列每個元素都不超過100,所以其實是先比較長度,再按位比較。
那麼將value(A)>value(B)value(A')>value(B')情況分爲兩種
1.AA'的長度大於BB'
這種情況可以對A,BA,B兩個序列算出每個長度有多少個子序列(這個可以在上面那個dp那裏加一維長度解決),前綴和一下就行了。
這部分O(n2+m2)O(n^2 + m^2)
2.長度相等
g[i][j][0/1]g[i][j][0/1]表示當前AA'序列結尾是AiA_iBB'序列結尾是BiB_iAA'的價值是否已經大於BB',的方案數,也是可以用二維前綴和優化的
這部分O(nm)O(nm)

E
一個n*m的網格圖,有的位置有障礙,有k(k<=m)個機器人從第一行上方豎直向下走進入圖,你可以在沒有障礙的位置放轉向器使機器人轉彎,但一旦放了就只能從這個轉向器提供的這兩個方向進入,最後一行有h(h<=m)個位置往下走就是出口,問能否放一些轉向器使每個機器人最終都能走到出口

我覺得題解寫的很好,不如直接貼題解了(懶)
在這裏插入圖片描述

G
一個顯然的性質是隻有當別的棋子對拿不了了我纔會只拿一個棋子(該棋子左下角沒有其它棋子又不能和白棋子一起拿而且卡住了別的棋子對)
所以任何時候剩餘的棋子狀態都可以用一條從左上到右下每次只能向下或向右的分界線表示。於是我們可以用C2nnC_{2n}^n的狀態表示這個分界線。
我們假設二進制狀態中0是向右,1是向下,發現拿掉一個棋子的操作對這個狀態的改動是把一個‘10‘變成’01‘。
然後就直接dp
O(C2nnn2)O(C_{2n}^{n}n^2)

K
首先,如果由某個葉子節點它的父親出度>1,那麼先手必勝
證明:
設原狀態是X
1.如果拿掉這個葉子節點是必敗態,X是必勝態
2.如果拿掉這個葉子節點是必勝態A,那麼A一定能轉移到某個必敗態B,且因爲拿掉這個葉子後並沒有產生新的葉子,所以A能轉移到的狀態X也能轉移到,因此X也能轉移到必敗態B,於是X是必勝態

如果不存在這樣的葉子,那麼統計每個葉子向根走到第一個出度>1的祖先的距離
如果距離全爲偶數,那麼先手必敗
否則先手必勝
策略是每次將所有奇數的拿掉葉子變成偶數
正確性顯然?

嗯暫時寫這麼多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章