別樣的 Duel 大戰 | From 11.11 ~ 11.12

LCat90發表於2024-11-12

Lovely_CatHxy 和 Ghost_Huang 已經大戰數 10 局了,全部都是 LCat 勝利!!!

都是 hxy 為什麼偏偏你這麼厲害呢(((

CF1257F

tag:簡單題 *2000

推一下式子,設 \((i,j)\) 表示前面選 \([1,i]\) 後面選 \([j,n]\)。式子裡面就儘量不要寫和 2 有關的了。

考慮分析 1 和 3 需要進入的點有多少個,然後再加上需要給 2 放多少個即可。

預處理 \(f(i)\),掃描 \(j\),維護字首 min 的 \(f(i)\),答案就是 \(\min\{ g(j)+ \min_{i<j} f(i)\}\)

CF233B

tag:dp,貪心 *1900

一定要設計對狀態:包含第 \(i\) 位能匹配到的最大位置。對於前字尾分別求一次。判定就是:要求所有 \(pre_i\ge nxt_i\)

考慮如何轉移,顯然可以從上一個字元相同的位置轉移過來。憑直覺:還需要考慮前面最大的匹配位置能否擴充套件,可以就更新。容易證明這樣轉移是充分的。

CF138D

tag:sg,dp,翻轉座標 *2500

說實話還是沒有搞懂座標怎麼翻的。

CF1866D

tag:dp 最佳化 *2300

按列 dp。設 \(f(i,j)\) 表示前 \(i\) 列選了 \(j\) 個位置。欽定前面位置不能選了。轉移考慮列舉 \(i+1\) 列選幾個位置,單次轉移平方。整體三次方。

考慮狀態數最佳化,發現一個 \(i\) 的合法 \(j\) 範圍是 \([i-k+1,i+k-1]\),是 \(O(k)\) 級別的。直接暴力 map 記錄狀態即可。時間複雜度 \(O(nmk\log ?)\)

CF1901E

tag:樹形 dp *2200

獨立寫出了需要換根的還沒有寫換根的做法。但是要維護 4 個東西的 mx 和 mxx,太懶了所以去看題解了。

發現不換根可以做,只需要不欽定當前點必選。

具體地,這個題本質就是不允許 deg = 2 的點出現。考慮 \(f(x,j),j\in [0,3]\) 表示有幾個兒子,3 表示大於等於。

\(x\) 這個點自己的點權在轉移最後加上,注意 2 不能加。

注意從 \(to\)\(x\) 的時候 \(f(to,2)\) 要加上 \(a_{to}\),1 不能選自己,要減去。

CF1114D

tag:區間 dp *1900

不要看錯題了。注意一開始選定了一個位置。

容易發現一個區間最後的顏色是 \(a_{l/r}\),根據這個可以 \(O(1)\) 轉移。

CF856D

tag:樹形 dp,LCA,樹上操作/差分 *2400

1 個月沒寫樹了居然一發過了。

考慮對於每個可加邊,在 LCA 處考慮他的貢獻。設為 \(z\)

發現 \(x\to z\to y\) 的路徑上的點都不可以和其他的可加邊有交了。畫圖理解一下。

本來我們的 dp 轉移是子樹求和,現在就需要把鏈上的這些點給減掉。

具體地,\(all(x)\) 表示子樹的 dp 和。(\(dp(x)\) 表示這個點可以被可加邊選中的 \(x\) 子樹內的最大和)

用資料結構給每個點維護:\(all(x)-dp(x)\)。每條可加邊的轉移:\(dp_x=\max\{all_x+val+f(x,p_x)+f(x,p_y)\}\)\(f(x,y)\) 表示從 \(i\)\(j\) 路徑上每個點維護的值的和。

單點修改鏈查詢,可以用 dfn + 樹剖做到 2log。也可以樹上差分用線段樹做到 1log。

CF509F

tag:區間 dp,樹形結構 *2300

幾乎做過一道一模一樣的題,所以獨立切了。

每次轉移顯然 \(a_l\) 是一定作為根的,然後列舉兒子。如何列舉?

欽定選中左兒子。即區間 \([l+1,k]\)。然後要保證右邊 \([k+1,r]\) 是個森林。為了方便我們就給他欽定一個虛的根 \(a_k\)。所以轉移是 \(dp(l+1,k)\times dp(k,r)\)

注意還有轉移 \(dp(l,r)\leftarrow dp(l+1,r)\),意義是 \(l\) 只有 1 個兒子。

題解中還有一種做法:設 \(f(l,r)\) 表示一棵樹,\(g(l,r)\) 表示森林,互相轉移即可。

CF1242C

tag:基環樹(置換環),狀壓 dp *2400

差不多想到了正解,但是差一點細節。

注意到元素互不相同,而且我們知道所有組最終的和。所以如果選了一個位置 \(x\),我們就知道另外一個一定要移過來的位置 \(y\)。連邊 \(x\to y\) 表示有 \(x\) 則必須有 \(y\)

點數是 \(kn\) 的,看成一般排列問題,也是 \((E=n,V=n)\) 的圖。所以是若干個內向基環樹。

分析知只有環上是有用的。所以先 topo 一遍再 dfs 對每個環考慮。

題目限制相當於是要求每個環中同一行的數只能出現 1 次,這個好判斷的。那麼剩下的就是一個簡單的子集 dp 了。程式碼有點難寫,主要是細節多。

corner case:一開始已經不用操作的行特殊處理。

CF1674G

tag:圖論,DAG dp *2000

首先先把所有 \(in=1/out=1\) 的點處理了。

然後發現就可以在剩下的圖裡面找一條最長路徑。嘗試構造刪邊方式使之存在:每個點選擇不在這條鏈的邊刪除即可。因為保證了 \(in_i/out_i\) 都大於 1,所以一定有解。

最長路徑直接 DAG 上 dp。

CF1799D2

tag:ds 最佳化 dp *2100

同 CSP-S T3。

相關文章