不要因為別人的過錯懲罰自己

LCat90發表於2024-10-28

總結一下這幾天做的題。

啦啦啦啦啦啦啦啦啦啦啦~(A5)

啦啦~ 啦啦~~~~~~~~~(Eb6)~(F6)

下面好像都只有 1900。

AT_abc267_f

讓我們對於每個點找到其距離最遠的點,這樣就可以回答所有疑問。

暴力找肯定不行,我們猜測每個點的目標點去重後不會很多。

直徑的性質:每個點在樹上距離最遠的點事直徑的兩個端點之一。

於是我們直接對於直徑的端點為根 dfs 即可,把詢問掛在樹上,每次只需回答 \(k\) 級祖先即可。

不需要倍增,由於 dfn,我們直接記錄當前 \(w_i\) 表示 \(dep_x=i\)\(x\) 即可。

AT_abc344_f

當時沒場切。可能沒有看題。

金幣太大,無法進入狀態。我們考慮貪心:每次只買金幣使得恰好能走到這裡。

考慮延遲計算,即我們可以將在 \((i,j)\) 買金幣變成:

  • 對於所有要經過 \((i, j)\) 的路徑 \((1,1)\to (x,y)\),可以在 \((i,j)\to (x,y)\) 的任何點上買 \(c_{i,j}\) 的金幣。

所以我們只需要把當前路徑上最大的 \(c_{i,j}\) 座標記入狀態即可。

注意此處我們的 dp 要記錄 2 個東西,一個是時間,一個是當前金幣。(很多時候是不能記錄 2 個的,但是此題時間嚴格優,金幣只是輔助狀態)

時間複雜度 4 次方。有一個類似的題,記錄最大的 \(w\) 即可,然後轉移套上 dijkstra。討論區裡面應該有連結。

AT_agc005_c

獨立做出來的,主要是 T1 的直徑太深刻了。

從葉子構造不太好做。

考慮極值,看看最大的 \(a_i\)?如何構造?

想到先把直徑拉出來(一條鏈)。然後把所有鏈上的 \(a_i\) 減去,構造剩下的 \(a_i\)

然後做完了。半個小時吧。

AT_arc058_b

人機題。

容斥沒什麼思路,主要是不知道容斥欽定什麼。

考慮劃分路徑,直接在第 \(b\) 列列舉是從哪一行過來的就行了。把兩邊直接合並即可。

方案數是經典的組合數。


今天上午什麼都沒做。太困了。

AT_agc049_c

很一眼的東西就是你先把所有 \(b_i<a_i\) 的區間全部消掉,然後把剩下消不掉的點進行操作。

兩種策略:

  1. 召喚一個 \(x+1\) 的人機把你噶了。

  2. 把自己的 \(b_i\) 減少。使之剛好覆蓋 \([1,a_i]\)

容易發現 2 操作修改的是一段字首。1 操作是單點,就做完了。

P5361

看到第二問無向圖最大獨立集 NP 完全問題害怕了 qwq。

直接 SA!

考慮構造一個不是最大的獨立集:每次把度數最小的點刪掉,直到所有點獨立。

再看第一問。答案不一定有單調性哦。但是幾個狀態之間的差別一定是連續的,所以還是依次刪掉度數小的點。找最大的答案。

P4006

本來只有 40 分的,亂搞過了,好像還被 zyr hack 了?

他自己也沒了。。。

dp 和貪心 dfs 很顯然。考慮確定根。

對於 \(in_x=1\)\(x\) 我們直接取最小的作為根並且把其出度點設為右兒子即可。

否則是 \(in_x=2\),我們肯定希望這個最小的 \(x\) 是第一個點。

記相鄰點為 \(l,r\),其構成子樹為 \(A,B\)

先以 \(x\) 為根算出 \(A,B\) 裡面的最小的第一個值,取這個值大的一邊作為根節點的選擇範圍。

然後隨機選點。但是我們可以先把 \(l/r\) 這種點選上先跑一遍。

這演算法能過所有資料我還是很震驚的,畢竟隨機選點都沒寫就過了。

相關文章