LGP5044口胡
阿新 • • 發佈:2022-02-25
套路題。
對於這一類與 \(\max\) 有關的題,優先考慮笛卡爾樹。
建出笛卡爾樹,考慮處理以某個點 \(u\) 舉辦會議時,參加會議的成本。
這裡考慮詢問區間為 \([1,n]\)。
明顯 \(u\) 的貢獻是 \(\sum_{i=1}^n\max([i,u])\)。(\([x,y]\) 代表序列上 \(x\) 到 \(y\) 的所有陣列成的集合)
考慮列舉這個 \(\max\),在笛卡爾樹上的 \(\max\) 對應 LCA。
假設節點 \(u\) 到根節點所經過的節點為 \(v_1\sim v_k\)(\(v_1=u,v_k=rt\)),那麼貢獻可以轉化為:
\[\sum_{i=1}^ka[v_i]\times (siz[v_i]-siz[v_{i-1}]) \]在這裡我們假設 \(siz[v_0]=0\)
拆一下:
\[\sum_{i=1}^k a[v_i]\times siz[v_i]-\sum_{i=1}^{k-1}a[v_{i+1}]\times siz[v_i] \]\[a[rt]\times n+\sum_{i=1}^{k-1}(a[v_i]-a[v_{i+1}])\times siz[v_i] \]很明顯 \(v_{i+1}\) 是 \(v_i\) 的父親。轉化為每個點固定點權,尋找一個節點使得其到根節點的權值最小。
注意到每個節點的權值一定是負的。
於是,我們有了一個 \(O(nm)\) 的演算法。
考慮使用區間笛卡爾樹的套路。只有左鏈和右鏈的權值會發生變化。
改寫一下:(這裡以右鏈為例)
\(V[v_1]\) 表示該節點到其左子樹中的某個節點,權值最小的權值。
注意需要減去當前“根節點”到真正的根節點的貢獻。
上述計算的是單個節點的貢獻,等價於一次函式。
考慮將單調棧可持久化,問題就變成了了靜態樹上一次函式最值。
(在這裡感謝Claris在U群中回答我的提問)
直接對其使用全域性平衡二叉樹即可。對每個節點建立凸包,直接歸併左右兒子即可。
每個節點被歸併 \(O(\log n)\) 次,複雜度是對的。
在凸包上二分轉化為對詢問排序,然後移動凸包上的答案指標。
總複雜度 \(O(n+m)\log n)\),可以通過。
程式碼在寫了在寫了