顯然是單調棧處理。
然而優弧/劣弧兩種情況,加上高度存在相同,就比較難處理。
然而環是可以平移的,所以乙個好的方法是將其中的最大值移到乙個端點,
於是跨環端點的情況只出現在 右半部分形成乙個單調不降的序列。
順便去重就可以了。
打表發現$dp_i=2*dp_-dp+2$
$dp_n$為最終的答案。
將式子拆一下,似乎正確性還挺顯然的。
當隊長到$i$的時候,前面的點都被經過了偶數次,
所以問題是類似的,可以進行$dp$。
用字首和來做到直接統計區間的資訊。
問題是$dag$刪乙個點情況下的最長路。
似乎有乙個經典的做法來解決這個問題。
在本題中即最長路徑生成樹。
刪掉乙個點$x$意義下的最長路,存在兩種情況:
終點不是$x$的子樹:預處理出答案,之後可以用$dfs$序,區間維護資訊解決。
終點是$x$的子樹:那麼存在一條路徑$a \rightarrow b$,滿足$a$不在$x$子樹中而$b$在。
預處理出每個點到達終點的最長路徑$dis_i$,由超級源點$s$到每個點的最長路徑$dep_i$。
即$ans_x$對$dep_a+dis_b+1$取$max$。
列舉邊$(a,b)$,可以用樹剖來支援取$max$操作。
乙個巧妙的做法是提前將所有的$dep_a+dis_b+1$從大到小排序,
所以每個點只需要第一次被更新,之後可以直接跳過。
所以可以用類似並查集的結構維護這個東西。
省選模擬102 題解
a.island 對於正負不同的情況,o n 列舉左側的位置然後計算。對於正負性相同的情況,把笛卡爾樹建出來,然後每次考慮跨過最小值的貢獻。分幾種情況 左右均不超過最小值,左右僅有乙個超過最小值,左右都超過最小值。然後順便統計上其中乙個端點為劃分點的貢獻。然後瘋狂的寫式子拆式子就沒了。做法挺簡單的,...
模擬17 題解
t1 a.入陣曲 60 演算法 維護一下某一列的從第一行到這一行和二維字首和 然後列舉上下左右邊界,o n 4 100 演算法 省掉左右邊界的列舉,改為從左向右掃一邊,記錄總和 k的餘數,並放入桶中,可以發現,如果這個值出現過,那說明這個位置的總和減去那個位置的差 即這個區間 是k的正倍數 t2又是...
模擬16 題解
貪心,對於每只青蛙,跳的時候盡量遠,越遠選擇越多 注意若用set實現,要先insert 0 1 include2 include3 include4 include5 include6 include 7 define r register 8using namespace std 9 inline...