CF1842 CodeTON Round 5

Hiostream發表於2024-10-30

Dashboard

A

最後輸的人總血量為 \(0\),贏的人總血量 \(>0\),發現無論咋操作每一輪過後兩人血量差不變,直接判斷血量差即可。link

B

只要棧頂是 \(x\) 的子集就可以一直取,直到碰到第一個不是子集的就取不了了。判一下全貪完是否 \(=x\) 就行。link

C

DP 能做到的最小保留個數。轉移 \(f(j)\overset{\text{checkmin}}{\rightarrow}f(i) \ (a_j=a_i)\) 以及 \(f(i-1)\rightarrow f(i)\)。對每個顏色維護目前的 DP 最小值就行。link

D

好玩題。

\(f(x)\)\(x\) 在聚會里的總時間。原本的限制用 \(|f(u)-f(v)|\le w\) 來表述是嚴格更弱的。我們對 \(|f(u)-f(v)|\le w\) 的這一版限制求出每個 \(x\) 能做到的最大 \(f(x)\)。即欽定 \(f(n)=0\),然後求 \(n\) 到每個點的最短路。

此時的 \(f(1)\) 是一個答案上界。然後來構造方案使得能夠取到該上界:若 \(f(u)>f(v)\),就讓 \(u\) 出現的聚會集合包含 \(v\) 出現的聚會集合,這樣一定滿足原限制。然後直接按 \(f\) 從小到大構造我們的偏序集合就行。link

E

DP,這裡設的是 \(f(i)\) 表示考慮了橫座標 \(\ge i\) 的所有區域所花代價最小值。你選的直角三角形區域肯定不交,列舉最後這個以 \(i\) 結尾的直角三角形的開頭橫座標 \(j\) 然後計算代價。

線段樹維護一下最小值。直角三角形代價為 \((j-i)A\) 關於 \(i,j\) 獨立可以拆開算。剩餘點的代價,每個點貢獻到的是一段字首區間,所以還得寫個區間加。link

F

我們發現 \(2\min(x,y)+|x-y|=x+y\)。設 \(siz(u)\) 表示 \(u\) 這邊子樹內有多少個黑點。考慮 \(\sum_{(x,y)}siz(x)+siz(y)=k(n-1)\) 是定值。因此要最大化絕對值之和,就要最小化 \(\sum_{(x,y)}\min(siz(x),siz(y))\),這玩意就是帶權重心到所有黑點的距離之和。

直接列舉重心,然後當然選的就是離重心最近的 \(k\) 個黑點,bfs 即可。link

相關文章