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。