總結一下這幾天做的題。
啦啦啦啦啦啦啦啦啦啦啦~(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\) 的區間全部消掉,然後把剩下消不掉的點進行操作。
兩種策略:
-
召喚一個 \(x+1\) 的人機把你噶了。
-
把自己的 \(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\) 這種點選上先跑一遍。
這演算法能過所有資料我還是很震驚的,畢竟隨機選點都沒寫就過了。