模擬102 題解

2022-03-16 19:19:06 字數 759 閱讀 4711

顯然是單調棧處理。

然而優弧/劣弧兩種情況,加上高度存在相同,就比較難處理。

然而環是可以平移的,所以乙個好的方法是將其中的最大值移到乙個端點,

於是跨環端點的情況只出現在 右半部分形成乙個單調不降的序列。

順便去重就可以了。

打表發現$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...